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.GetSubArray
wird 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.
Empfohlene Maßnahme
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]);