UfcppSample icon indicating copy to clipboard operation
UfcppSample copied to clipboard

First-class Span Types

Open ufcpp opened this issue 1 year ago • 3 comments

https://github.com/dotnet/csharplang/blob/main/proposals/first-class-span-types.md

VS 17.13 p1 (C# 13 が GA になった瞬間)で merge されてる。

{ }

string[] a = [];
ReadOnlySpan<object> a2 = a; // C# 13 でも OK

Span<string> s = [];
ReadOnlySpan<object> s2 = s; // これは 13 だとエラー。

C.M(new object[1]); // これは 13 だと ambiguous。preview だと Span っぽい。ReadOnlySpan にするみたいな話はみた。

new int[1].Ex(); // 13 だと拡張メソッドでの T[] → ROS<T> 変換は見てくれない。

static class C
{
    public static void M(ReadOnlySpan<object> s) { }
    public static void M(Span<object> s) { }
    public static void M(IEnumerable<object> s) { }

    public static void Ex(this ReadOnlySpan<int> _) { }
}

ufcpp avatar Nov 12 '24 23:11 ufcpp

ただ、これによって新たに別のあいまい性エラーになるケースが出てくる。 (Assert.Equals<T>(ReadOnlySpan<T> expected, T[] actual) がそうらしい。) これは「OverloadResolutionPriority を付けて回避しようか」という話になってる。

試してみてるけど ROS<T>, T[] だと問題なさそうだった。 ↓かな?

C.M(new int[1], []); // first-class span でも解決不能っぽい。

static class C
{
    public static void M(int[] s, int[] a) { }

    // こっちを呼んでもらうために OverloadResolutionPriority 付けてしのいでもらおうかという話あり。
    public static void M(ReadOnlySpan<int> s, ReadOnlySpan<int> a) { }
}

ufcpp avatar Nov 13 '24 01:11 ufcpp

NRT covariance:

ReadOnlySpan<string> s = ["a", "b"];
ReadOnlySpan<string?> n = s; // ここの nullability 警告も消える(nullable covariance が有効に)。

Console.WriteLine(string.Join(", ", n));

ufcpp avatar Nov 15 '24 06:11 ufcpp

ReadOnlySpan<string> s = ["a", "b"];
ReadOnlySpan<object> o = s;

ReadOnlySpan<object> o = ReadOnlySpan<object>.CastUp(s);

ufcpp avatar Nov 15 '24 08:11 ufcpp

https://ufcpp.net/study/csharp/resource/span/#first-class-span https://ufcpp.net/study/csharp/cheatsheet/ap_ver14/#first-class-span

ufcpp avatar Aug 31 '25 08:08 ufcpp