Udostępnij za pośrednictwem


RuntimeHelpers.GetSubArray zwraca inny typ

Typ wystąpienia tablicy zwróconego przez RuntimeHelpers.GetSubArray<T>(T[], Range) element został zmieniony tak, aby był zgodny z tablicą źródłową. RuntimeHelpers.GetSubArray jest używany przez kompilator języka C# do implementowania operatora zakresu dla tablic.

Tę zmianę zachowania można zaobserwować tylko za pomocą kodu, który używa kowariantnych konwersji tablicy.

Poprzednie zachowanie

RuntimeHelpers.GetSubArray<T>(T[] array, Range range) Wcześniej zwrócił wystąpienie tablicy typu T[].

Na przykład typ wystąpienia tablicy zwrócony przez RuntimeHelpers.GetSubArray<object>(new string[1], ...) element to object[].

Nowe zachowanie

Począwszy od platformy .NET 9, RuntimeHelpers.GetSubArray<T>(T[] array, Range range) zwraca wystąpienie tablicy tego samego typu co array parametr .

Na przykład typ wystąpienia tablicy zwrócony przez RuntimeHelpers.GetSubArray<object>(new string[1], ...)string[]to .

Wprowadzona wersja

.NET 9 (wersja zapoznawcza 1)

Typ zmiany powodującej niezgodność

Ta zmiana jest zmianą behawioralną.

Przyczyna wprowadzenia zmiany

Projekt funkcji dopasowywania wzorców w języku C# zakłada, że typ wystąpienia tablicy zwracany przez RuntimeHelpers.GetSubArray<T>(T[], Range) jest zgodny z tablicą źródłową. Poprzednie zachowanie doprowadziło do nieoczekiwanego zachowania niektórych złożonych wyrażeń wzorców, które używały fragmentowania tablic kowariantnych. Aby uzyskać więcej informacji, zobacz dotnet/roslyn#69053.

Zalecaną akcją jest usunięcie zależności kodu, którego dotyczy problem, wariancji tablicowej.

Na przykład zmień:

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

na:

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

Dotyczy interfejsów API