Freigeben über


RuntimeHelpers.GetSubArray gibt anderen Typ zurück

Der Typ der Arrayinstanz, der von RuntimeHelpers.GetSubArray<T>(T[], Range) zurückgegeben wird, wurde geändert, um mit dem Quellarray übereinzustimmen. RuntimeHelpers.GetSubArraywird vom C#-Compiler verwendet, um den Bereichsoperator für Arrays zu implementieren.

Diese Verhaltensänderung kann nur durch Code beobachtet werden, der kovariante Arraykonvertierungen verwendet.

Vorheriges Verhalten

Zuvor wurde von RuntimeHelpers.GetSubArray<T>(T[] array, Range range) eine Arrayinstanz vom Typ T[]zurückgegeben.

Von RuntimeHelpers.GetSubArray<object>(new string[1], ...) wurde beispielsweise eine Arrayinstanz vom Typ object[] zurückgegeben.

Neues Verhalten

Ab .NET 9 gibt RuntimeHelpers.GetSubArray<T>(T[] array, Range range) eine Arrayinstanz vom gleichen Typ zurück wie der array-Parameter.

Von RuntimeHelpers.GetSubArray<object>(new string[1], ...) wird beispielsweise eine Arrayinstanz vom Typ string[] zurückgegeben.

Eingeführt in Version

.NET 9 Preview 1

Typ des Breaking Changes

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Bei C#-Musterabgleichsfeatures wird entwurfsbedingt davon ausgegangen, dass der Typ der Arrayinstanz, die von RuntimeHelpers.GetSubArray<T>(T[], Range) zurückgegeben wird, dem Typ des Quellarrays entspricht. Das vorherige Verhalten führte zu unerwartetem Verhalten bestimmter komplexer Musterausdrücke mit Segmentierung von kovarianten Arrays. Weitere Informationen finden Sie unter dotnet/roslyn#69053.

Es wird empfohlen, die Abhängigkeit des betroffenen Codes von der Arraykovarianz zu entfernen.

Ändern Sie beispielsweise:

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

in:

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

Betroffene APIs