Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
A partire da .NET 11, le operazioni multidimensionali di copia e che accettano una destinazione rifiutano layout di archiviazione sovrapposti non supportati con ArgumentException prima di scrivere l'output. I costruttori di tensor-span convalidano anche il tipo di elemento dell'archiviazione System.Array.
La modifica viene distribuita nel pacchetto System.Numerics.Tensors, inclusi i framework di destinazione supportati. L'aggiornamento del pacchetto può influire sulle app che hanno come destinazione versioni precedenti di .NET. Le API separate TensorPrimitives mantengono il contratto di overlap esistente.
Versione introdotta
.NET 11
Comportamento precedente
CopyTo, FlattenTo, TryCopyTo e TryFlattenTo documentano il supporto per la memoria di origine e di destinazione sovrapposte. I Try metodi descritti trattavano la sorgente come se fosse stata prima copiata nell'archivio temporaneo.
Ad esempio, la sorgente e la destinazione seguenti fanno riferimento a aree sovrapposte dello stesso 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);
Il contratto di tipo snapshot documentato implica che la destinazione riceverà [1, 2, 4, 5]. I risultati effettivi per la sovrapposizione non supportata possono dipendere dal layout e dall'ordine di percorrenza; l'implementazione non soddisfava in modo affidabile tale contratto.
I costruttori che hanno preso System.Array non hanno convalidato in modo coerente se il tipo di elemento della matrice era compatibile con T.
Nuovo comportamento
L'esempio genera un'eccezione ArgumentException prima di copiare. La stessa sovrapposizione non supportata viene generata anche da TryCopyTo e TryFlattenTo quando la forma e i controlli della capacità hanno esito positivo.
La sovrapposizione supportata rimane specifica dell'operazione:
| Operazione | Sovrapposizione consentita |
|---|---|
CopyTo e TryCopyTo |
Origine e destinazione dense con conteggi di elementi uguali o viste esattamente identiche. |
FlattenTo e TryFlattenTo |
Un'origine densa e l'intervallo di destinazione. |
| Operazioni element-wise con destinazione | Viste di input/output identiche senza posizioni di archiviazione logiche ripetute. Gli input di trasmissione con sovrapposizione spostata e sovrapposti vengono rifiutati. |
Tensor.ResizeTo |
Origine e destinazione dense. La sovrapposizione a passi non supportata non è consentita. |
| Ritorno alla stessa visualizzazione | Reversione densa in-place, o una reversione no-op. |
I metodi di copia restituiscono ancora false, senza copiare, quando la destinazione è troppo breve.
TryCopyTo restituisce false anche per forme incompatibili. La sovrapposizione non supportata è un layout non valido, non un errore di capacità.
Tensor.ResizeTo e la concatenazione in una destinazione esistente rifiutano una dimensione zero-stride che contiene più di un elemento logico. Le destinazioni vuote e gli stride pari a zero nelle dimensioni singleton rimangono consentiti.
TensorSpan<T> e ReadOnlyTensorSpan<T> costruttori che accettano System.Array generano ArrayTypeMismatchException per i tipi di elementi di matrice incompatibili. Gli span di tensori scrivibili rifiutano anche matrici covarianti; gli span di tensori di sola lettura consentono la covarianza per tipi di riferimento compatibili.
Tipo di cambiamento che interrompe la compatibilità
Si tratta di un cambiamento comportamentale.
Motivo della modifica
Le copie corrette tra tensori strided sovrapposti arbitrariamente possono richiedere l'archiviazione temporanea proporzionale all'intero tensore. Il rifiuto esplicito evita il danneggiamento dipendente dall'attraversamento senza allocare in modo silenzioso snapshot full-tensor.
I percorsi di archiviazione di output ripetuti non possono rappresentare risultati logici distinti. La convalida del tipo di elemento dell'array impedisce l'interpretazione dell'archiviazione incompatibile come T e impedisce le scritture tramite l'archiviazione di array covarianti.
Azione consigliata
Usare una memoria di destinazione non sovrapposta o creare uno snapshot esplicito della sorgente prima di una copia sovrapposta. Per l'esempio precedente:
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
Lo snapshot contiene [1, 2, 4, 5]. Per le operazioni elementwise con destinazione, creare uno snapshot di ogni input sovrapposto o allocare un risultato separato. Sostituire le destinazioni di trasmissione con la destinazione di output indirizzabile indipendentemente.
Per uno span di tensore su System.Array, fornire una memoria per elementi compatibile. Per una visualizzazione scrivibile, usare un array che non è covariante o copiare gli elementi in un nuovo T[].
Non presupporre che un metodo di copia Try non possa generare un'eccezione. Un risultato false indica capacità insufficiente o, per TryCopyTo, dimensioni incompatibili. Nessun commutatore di compatibilità ripristina il comportamento di sovrapposizione arbitraria.
Le API interessate
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.CopyTo.
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.FlattenTo.
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.TryCopyTo.
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.TryFlattenTo.
- I corrispondenti metodi copy e flatten su Tensor<T>, TensorSpan<T> e ReadOnlyTensorSpan<T>.
- Metodi elemento per elemento con argomento di destinazione in Tensor, incluse operazioni unarie, binarie e tensore/scalare.
- System.Numerics.Tensors.Tensor.ResizeTo (tutti gli overload).
- System.Numerics.Tensors.Tensor.Reverse e System.Numerics.Tensors.Tensor.ReverseDimension (overload che accettano una destinazione).
- System.Numerics.Tensors.Tensor.Concatenate (overload che accetta una destinazione).
-
TensorSpan<T> e ReadOnlyTensorSpan<T> (i due overload in ogni tipo che accettano
System.Array).