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
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈