https://github.com/dotnet/csharplang/blob/main/proposals/first-class-span-types.md VS 17.13 p1 (C# 13 が GA になった瞬間)で merge されてる。 ```cs { } 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> _) { } } ``` 「`Span` の変数に対して `ReadOnlySpan` 引数な拡張メソッドを呼べる(のでオーバーロード増やさなくていい)」と、 「`ReadOnlySpan` なオーバーロードが優先的に呼ばれてくれる」の2点で、 パフォーマンス的なメリットあり。 `IEnumerable` オーバーロードがあったりすると、「C# 13 と 14 で呼ばれるものが変わる」という破壊的変更一応あり。 (その2つで中身が全然違うみたいな実装することはないと思うので影響は軽微。)
Activity
ufcpp commentedon Nov 13, 2024
ただ、これによって新たに別のあいまい性エラーになるケースが出てくる。
(
Assert.Equals<T>(ReadOnlySpan<T> expected, T[] actual)がそうらしい。)これは「
OverloadResolutionPriorityを付けて回避しようか」という話になってる。試してみてるけど
ROS<T>, T[]だと問題なさそうだった。↓かな?
ufcpp commentedon Nov 15, 2024
NRT covariance:
ufcpp commentedon Nov 15, 2024
↓
ufcpp commentedon Aug 31, 2025
https://ufcpp.net/study/csharp/resource/span/#first-class-span
https://ufcpp.net/study/csharp/cheatsheet/ap_ver14/#first-class-span