RuntimeHelpers.GetSubArray 返回不同类型

RuntimeHelpers.GetSubArray<T>(T[], Range) 返回的数组实例类型已更改为与源数组匹配。 C# 编译器使用 RuntimeHelpers.GetSubArray 来实现数组的范围运算符

只有使用协变数组转换的代码才能观察到此行为变更。

旧行为

以前,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 预览版 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