コードインスペクション:C# 14 のスパンパラメーターを持つオーバーロード解決に関する破壊的変更
C# 14 は新しい 組み込みのスパン変換と型推論規則(英語)を導入します。 これにより、スパンパラメーターによるオーバーロードをより多くのシナリオに適用できるようになりますが、いくつかの 互換性を破る変更も発生します。
JetBrains Rider は、これらの重大な変更によって影響を受ける可能性がある箇所を特定し、見直すことを提案します。 変更された動作の箇所すべてがコンパイル時または実行時にエラーを引き起こすわけではないため、すべての提案を修正する必要はありません。 すべての箇所を確認し、コンパイル時または実行時にエラーを引き起こす可能性のある箇所を修正した後、このインスペクションを無効にすることをお勧めします。
以前の行動
C# 14 より前の C# では、 ReadOnlySpan<T> または Span<T> パラメーターを持つ拡張メソッドを T[] 型の配列に直接適用することができませんでした。 その結果、配列を扱う場合、コンパイラーはメソッド解決時に非スパン拡張メソッド(System.Linq.Enumerable クラスで定義されているものなど)のみを選択していました。
新しい行動
C# 14 以降、 ReadOnlySpan<T> または Span<T> パラメーターを受け入れるメソッドは型推論の機能が拡張され、より幅広いコンテキストで拡張メソッドとして機能できるようになりました。 その結果、 System.MemoryExtensions などのライブラリに含まれる span ベースのメソッドは、予期せず実行時例外をトリガーする可能性のある追加のシナリオにも適用できるようになりました。
サンプル
共変配列に対して Span<T> によるオーバーロードを選択した場合の実行時の ArrayTypeMismatchException:
string[] strings = new[] { "a" };
M(strings);
void M(object[] possibleCovariantArray)
{
// ok with C# 13 because it uses overload with IEnumerable<T>,
// but in C# 14, ArrayTypeMismatchException is thrown at runtime
// when converting a covariant array to Span<object>
Util.DoSomething(possibleCovariantArray);
}
static class Util
{
public static void DoSomething<T>(IEnumerable<T> e) =>
Console.Write("IEnumerable<T>");
public static void DoSomething<T>(Span<T> s) =>
Console.Write("Span<T>");
}
オーバーロード解決の変更によるコンパイルエラー:
string[] strings = new[] { "a" };
// C# 13 uses overload with IEnumerable<T>, which has a return type,
// but C# 14 uses overload with Span<T>, which has no return type
_ = strings.Reverse();
static class Util
{
public static IEnumerable<T> Reverse<T>(this IEnumerable<T> e) =>
throw new NotImplementedException();
public static void Reverse<T>(this Span<T> s) =>
throw new NotImplementedException();
}
解釈付きでコンパイルされたときの式ラムダでの実行時例外:
using System.Linq.Expressions;
// ok with C# 13, but causes a runtime exception in C# 14
// because it uses overload with ReadOnlySpan<T>
M((array, num) => array.Contains(num));
void M(Expression<Func<int[], int, bool>> e) =>
e.Compile(preferInterpretation: true);
詳細については、Microsoft の公式ドキュメントを参照してください。
2026 年 6 月 12 日