UfcppSample
UfcppSample copied to clipboard
First-class Span Types
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> _) { }
}
ただ、これによって新たに別のあいまい性エラーになるケースが出てくる。
(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) { }
}
NRT covariance:
ReadOnlySpan<string> s = ["a", "b"];
ReadOnlySpan<string?> n = s; // ここの nullability 警告も消える(nullable covariance が有効に)。
Console.WriteLine(string.Join(", ", n));
ReadOnlySpan<string> s = ["a", "b"];
ReadOnlySpan<object> o = s;
↓
ReadOnlySpan<object> o = ReadOnlySpan<object>.CastUp(s);
https://ufcpp.net/study/csharp/resource/span/#first-class-span https://ufcpp.net/study/csharp/cheatsheet/ap_ver14/#first-class-span