Skip to content

First-class Span Types #479

@ufcpp

Description

@ufcpp

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> _) { }
}

Span の変数に対して ReadOnlySpan 引数な拡張メソッドを呼べる(のでオーバーロード増やさなくていい)」と、
ReadOnlySpan なオーバーロードが優先的に呼ばれてくれる」の2点で、
パフォーマンス的なメリットあり。

IEnumerable オーバーロードがあったりすると、「C# 13 と 14 で呼ばれるものが変わる」という破壊的変更一応あり。
(その2つで中身が全然違うみたいな実装することはないと思うので影響は軽微。)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions