次の方法で共有


スパン パラメーターを使用した C# 14 オーバーロードの解決

.NET 10 に付属する C# 14 では、新しい 組み込みのスパン変換と型推論規則が導入されています。 これらの変更により、より多くのシナリオで適用できるスパン パラメーターを持つオーバーロードが行われます。

以前の動作

C# 13 以前では、ReadOnlySpan<T> または Span<T> レシーバーを受け取る拡張メソッドは、T[]型の値には適用できませんでした。 そのため、通常、System.Linq.Enumerable クラスのメソッドのようなスパン以外の拡張メソッドのみが、Expression ラムダ内でバインドされていました。

新しい動作

C# 14 以降では、ReadOnlySpan<T> パラメーターまたは Span<T> パラメーターを持つメソッドは、型推論に参加したり、より多くのシナリオで拡張メソッドとして使用したりできます。 これにより、System.MemoryExtensions クラスのメソッドのようなスパンベースのメソッドは、解釈を使用してコンパイルされるときに実行時例外が発生する Expression ラムダ内など、より多くのシナリオでバインドされます。

導入されたバージョン

.NET 10 Preview 1

破壊的変更の種類

この変更は、動作変更です。

変更の理由

C# 言語機能を使用すると、API の設計と使用方法を簡略化できます (たとえば、1 つの ReadOnlySpan<T> 拡張メソッドをスパンと配列の両方に適用できます)。

式の解釈を引き続き使用する必要がある場合は、たとえば、メソッドシグネチャが受け取る正確な型に引数をキャストするか、拡張メソッドを明示的な静的呼び出しとして呼び出すことによって、スパン以外のオーバーロードがバインドされていることを確認します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

M((array, num) => array.Contains(num)); // fails, binds to MemoryExtensions.Contains
M((array, num) => ((IEnumerable<int>)array).Contains(num)); // ok, binds to Enumerable.Contains
M((array, num) => array.AsEnumerable().Contains(num)); // ok, binds to Enumerable.Contains
M((array, num) => Enumerable.Contains(array, num)); // ok, binds to Enumerable.Contains

void M(Expression<Func<int[], int, bool>> e) => e.Compile(preferInterpretation: true);

影響を受ける API