Tensor-operationer avvisar lagringslayout som inte stöds

Från och med .NET 11 avvisar flerdimensionella Tensor-kopierings- och måltagningsåtgärder överlappande lagringslayouter som inte stöds innan de skriver utdata med ArgumentException. Tensor-span-konstruktorer verifierar också elementtypen för lagringen för System.Array.

Ändringen levereras i paketet System.Numerics.Tensors , inklusive dess målramverk som stöds. Uppdatering av paketet kan påverka appar som riktar sig mot tidigare .NET versioner. De separata TensorPrimitives API:erna behåller sitt befintliga överlappningskontrakt.

Version som introducerades

.NET 11

Tidigare beteende

CopyTo, FlattenTo, TryCopyTo och TryFlattenTo dokumenterade stöd för överlappande käll- och mållagring. De Try beskrivna metoderna hanterade källan som om den först hade kopierats till tillfällig lagring.

Följande källa och mål refererar till exempel till överlappande regioner i samma array:

int[] storage = { 1, 2, 3, 4, 5, 6 };
ReadOnlyTensorSpan<int> source = new(storage, new nint[] { 2, 2 }, new nint[] { 3, 1 });
TensorSpan<int> destination = new(storage, new nint[] { 2, 2 });
source.CopyTo(destination);

Det dokumenterade avtalet av snapshot-typ innebar att destinationen skulle ta emot [1, 2, 4, 5]. Faktiska resultat för överlappning som inte stöds kan bero på layout och traverseringsordning; implementeringen uppfyllde inte kontraktet på ett tillförlitligt sätt.

Konstruktorer som tog System.Array verifierade inte konsekvent om matrisens elementtyp var kompatibel med T.

Nytt beteende

Exemplet genererar ArgumentException innan kopiering. Samma överlappning som inte stöds utlöser också fel från TryCopyTo och TryFlattenTo när deras form- och kapacitetskontroller lyckas.

Stöd för överlappning är fortfarande åtgärdsspecifikt:

Operation Stödd överlappning
CopyTo och TryCopyTo Kompakt källa och mål med lika antal element eller exakt identiska vyer.
FlattenTo och TryFlattenTo En kompakt källa och målspannet.
Elementvisa operationer med destinationsargument Identiska in- och utdatavyer utan upprepade logiska lagringsplatser. Förskjutna överlapp och överlappande broadcast-indata avvisas.
Tensor.ResizeTo Tätplacerad källa och destination. Överlappning med stride som inte stöds avvisas.
Återställning till samma vy Kompakt omvändning på plats eller en no-op-omvändning.

Kopieringsmetoderna Try returnerar fortfarande false, utan att kopiera, när målet är för kort. TryCopyTo returnerar false också för inkompatibla shape. Överlappning som inte stöds är en ogiltig layout, inte ett kapacitetsfel.

Tensor.ResizeTo och sammanfogning till ett befintligt mål avvisar en nollstegsdimension som innehåller mer än ett logiskt element. Tomma mål och nollsteg i singleton-dimensioner är fortfarande tillåtna.

TensorSpan<T> och ReadOnlyTensorSpan<T>-konstruktorer som tar System.Array utlöser ArrayTypeMismatchException för inkompatibla matriselementtyper. Skrivbara tensoromfång avvisar också kovarianta arrayer; skrivskyddade tensoromfång tillåter kompatibel kovarians för referenstyper.

Typ av kompatibilitetsbrytande ändring

Det här är en beteendeförändring.

Orsak till ändringen

Korrekta kopior mellan godtyckligt överlappande stridade tensorer kan kräva tillfällig lagring som är proportionell mot hela tensorn. Explicit avvisande undviker traverseringsberoende korruption utan att tyst allokera fullständiga tensorögonblicksbilder.

Lagringsplatser för upprepade utdata kan inte representera distinkta logiska resultat. Validering av matriselementtyp förhindrar att inkompatibel lagring tolkas som T och förhindrar skrivningar via kovariant matrislagring.

Använd icke-överlappande utdatalagring eller ta en explicit ögonblicksbild av källan innan du kopierar med överlappning. I föregående exempel:

int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);

Ögonblicksbilden innehåller [1, 2, 4, 5]. För elementbaserade åtgärder som tar emot mål, ta en ögonblicksbild av varje överlappande indata eller allokera ett separat resultat. Ersätt sändningsmål med oberoende adresserbara utdatalagringar.

För ett tensorintervall över System.Array ange kompatibel elementlagring. För en skrivbar vy använder du en array som inte är samvariant eller kopierar elementen till en ny T[].

Anta inte att en Try kopieringsmetod inte kan kasta ett undantag. Ett false resultat hanterar otillräcklig kapacitet eller, för TryCopyTo, inkompatibla dimensioner. Ingen kompatibilitetsväxel återställer beteendet för godtycklig överlappning.

Berörda API:er

Se även