Operace Tensoru odmítají nepodporovaná rozložení úložiště.

Počínaje .NET 11 multidimenzionální operace kopírování Tensoru a operace přijímající cíl odmítnou nepodporovaná překrývající se rozložení úložiště pomocí ArgumentException předtím, než zapíšou výstup. Konstruktory Tensor-span také ověřují typ prvku úložiště System.Array.

Tato změna se dodává v balíčku System.Numerics.Tensors, včetně podporovaných cílových frameworků. Aktualizace balíčku může mít vliv na aplikace, které cílí na dřívější .NET verze. Samostatná TensorPrimitives rozhraní API si zachovají stávající specifikaci překryvu.

Verze byla představena

.NET 11

Předchozí chování

CopyTo, FlattenTo, TryCopyTo a TryFlattenTo mají zdokumentovanou podporu překrývajícího se zdrojového a cílového úložiště. Popsané metody zpracovávaly zdroj, jako by byl nejprve zkopírován do dočasného úložiště.

Například následující zdroj a cíl odkazují na překrývající se oblasti stejného pole:

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);

Zdokumentovaný kontrakt typu snapshot naznačoval, že cíl obdrží [1, 2, 4, 5]. Skutečné výsledky nepodporovaného překrývání můžou záviset na rozložení a pořadí procházení; implementace ne vždy spolehlivě splňovala danou specifikaci.

Konstruktory, které přijímaly System.Array, nekonzistentně neověřovaly, zda byl typ prvku pole kompatibilní s T.

Nové chování

Příklad vyvolá výjimku ArgumentException před kopírováním. Stejné nepodporované překrytí je také vyvoláno z TryCopyTo a TryFlattenTo, když se jejich tvar a kapacita úspěšně zkontrolují.

Podporované překrývání zůstává specifické pro operace:

Operation Podporované překrytí
CopyTo a TryCopyTo Hustý zdroj a cíl se stejným počtem prvků nebo přesně stejnými zobrazeními
FlattenTo a TryFlattenTo Zdrojová hustota a cílové rozpětí.
Operace po prvcích s cílovým argumentem Identická vstupní a výstupní zobrazení bez opakování umístění logického úložiště. Posunuté překryvy a překrývající se vstupy vysílání jsou odmítnuty.
Tensor.ResizeTo Zhuštěný zdroj a cílové umístění Nepodporované překrytí s krokováním je odmítnuto.
Obrácení do stejného zobrazení Zhuštěné obrácení na místě, nebo obrácení bez operace.

Metody pro Try kopírování stále vrací false, bez kopírování, pokud je cíl příliš krátký. TryCopyTo vrátí také false pro nekompatibilní tvary. Nepodporované překrytí je neplatné rozvržení, nikoli selhání kapacity.

Tensor.ResizeTo a zřetězení do existujícího cíle odmítne dimenzi nulového stridu, která obsahuje více než jeden logický prvek. Prázdné cíle a nulové kroky v singletonových dimenzích zůstanou povoleny.

TensorSpan<T> a ReadOnlyTensorSpan<T> konstruktory, které přebírají System.Array, vyvolají ArrayTypeMismatchException pro nekompatibilní typy prvků pole. Zapisovatelné rozsahy tensoru také odmítnou kovariantní pole; rozsahy tensoru jen pro čtení umožňují kompatibilní kovarianci referenčního typu.

Typ zásadní změny

Jedná se o změnu chování.

Důvod změny

Správné kopie mezi libovolně překrývajícími se stridovanými tenzory mohou vyžadovat dočasné úložiště úměrné celému tensoru. Explicitní odmítnutí zabraňuje poškození závislému na průchodu bez tichého přidělování snímků plného tenzoru.

Duplicitní umístění výstupního úložiště nemohou představovat jedinečné logické výsledky. Ověřování typu elementu pole zabraňuje interpretaci nekompatibilního úložiště jako T a zabraňuje zápisu prostřednictvím kovariantního úložiště pole.

Použijte nepřekrývající se výstupní úložiště nebo explicitně vytvořte snímek zdroje před překrývajícím se kopírováním. Pro předchozí příklad:

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

Snímek obsahuje [1, 2, 4, 5]. U prvkových operací zapisujících do cíle vytvořte snímek každého překrývajícího se vstupu nebo alokujte samostatný výsledek. Nahraďte cíle vysílání samostatně adresovatelným výstupním úložištěm.

Pro tensor span over System.Array, poskytněte kompatibilní úložiště elementů. Pro zapisovatelné zobrazení použijte pole, které není kovariantní, nebo zkopírujte prvky do nového T[].

Nepředpokládejte, že metoda kopírování Try nemůže vyvolat výjimku. false Výsledek označuje nedostatečnou kapacitu nebo v případě TryCopyTo nekompatibilní tvary. Žádný přepínač kompatibility neobnoví chování při libovolném překrytí.

Ovlivněná rozhraní API

Viz také