Поделиться через


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( предварительная версия 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