次の方法で共有


RuntimeHelpers.GetSubArray が異なる型を返す

RuntimeHelpers.GetSubArray<T>(T[], Range)によって返される配列インスタンスの型が、ソース配列と一致するように変更されました。 RuntimeHelpers.GetSubArray は、配列の 範囲演算子 を実装するために C# コンパイラによって使用されます。

この動作の変更は、共変配列変換を使用するコードによってのみ観察できます。

以前の動作

以前は、 RuntimeHelpers.GetSubArray<T>(T[] array, Range range)T[]型の配列インスタンスを返しました。

たとえば、 RuntimeHelpers.GetSubArray<object>(new string[1], ...) によって返された配列インスタンスの型は object[]

新しい動作

.NET 9 以降では、 RuntimeHelpers.GetSubArray<T>(T[] array, Range range) は、 array パラメーターと同じ型の配列インスタンスを返します。

たとえば、 RuntimeHelpers.GetSubArray<object>(new string[1], ...) によって返される配列インスタンスの型は string[]

導入されたバージョン

.NET 9 Preview 1

破壊的変更の種類

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

変更の理由

C# パターンマッチング機能の設計では、 RuntimeHelpers.GetSubArray<T>(T[], Range) によって返される配列インスタンスの型がソース配列と一致することを前提としています。 以前の動作は、共変配列のスライスを使用する特定の複雑なパターン式の予期しない動作につながりました。 詳細については、 dotnet/roslyn#69053 を参照してください。

推奨されるアクションは、配列の共分散に対する影響を受けるコードの依存関係を削除することです。

たとえば、次の変更を行います。

object[] arr = new string[1];
M(arr[1..2]);

宛先:

string[] arr = new string[1];
M(arr[1..2]);

影響を受ける API