Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ab .NET 11 lehnen multidimensionale Tensor-Kopier- und Operationen mit Zielparameter nicht unterstützte überlappende Speicherlayouts mit ArgumentException ab, bevor sie die Ausgabe schreiben. Tensor-Span-Konstruktoren überprüfen auch den Elementtyp des System.Array-Storage.
Die Änderung wird im Paket System.Numerics.Tensors bereitgestellt, einschließlich der unterstützten Zielframeworks. Das Aktualisieren des Pakets kann sich auf Apps auswirken, die auf frühere .NET Versionen abzielen. Die separaten TensorPrimitives APIs behalten ihren bisherigen Overlap-Contract bei.
Eingeführt in Version
.NET 11
Bisheriges Verhalten
CopyTo, FlattenTo, TryCopyTo und TryFlattenTo dokumentierten die Unterstützung für überlappenden Quell- und Zielspeicher. Die Try-Methoden beschrieben die Behandlung der Quelle, als wäre sie zuvor in temporären Speicher kopiert worden.
Die folgende Quelle und das folgende Ziel beziehen sich beispielsweise auf überlappende Bereiche desselben Arrays:
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);
Der dokumentierte Vertrag im Momentaufnahme-Stil impliziert, dass der Zielort [1, 2, 4, 5] erhalten würde. Die tatsächlichen Ergebnisse bei nicht unterstützten Überlappungen können von der Layout- und Traversalreihenfolge abhängen; die Implementierung erfüllte diesen Vertrag nicht zuverlässig.
Konstruktoren, die System.Array annahmen, überprüften nicht konsistent, ob der Elementtyp des Arrays mit T kompatibel war.
Neues Verhalten
Im Beispiel wird vor dem Kopieren ArgumentException ausgelöst. Die gleiche nicht unterstützte Überlappung wird auch von TryCopyTo und TryFlattenTo ausgelöst, wenn ihre Form- und Kapazitätsüberprüfungen erfolgreich sind.
Die unterstützte Überlappung bleibt vorgangsspezifisch:
| Operation | Unterstützte Überschneidung |
|---|---|
CopyTo und TryCopyTo |
Dichte Quell- und Zielstrukturen mit gleicher Elementanzahl oder exakt identische Ansichten. |
FlattenTo und TryFlattenTo |
Eine dichte Quelle und der Zielbereich. |
| Elementweise Operationen mit Zielparameter | Identische Eingabe-/Ausgabeansichten ohne wiederholte logische Speicherpositionen. Verschobene Überlappungen und überlappende Broadcast-Eingaben werden abgelehnt. |
Tensor.ResizeTo |
Dichte Quelle und Ziel. Nicht unterstützte Schrittweitenüberlappungen werden abgelehnt. |
| Umkehrung in dieselbe Ansicht | Kompakte In-Place-Umkehrung oder eine Umkehrung ohne Effekt (No-Op). |
Die Try Kopiermethoden geben weiterhin false zurück, ohne zu kopieren, wenn das Ziel zu kurz ist.
TryCopyTo gibt auch false für inkompatible Shapes zurück. Nicht unterstützte Überlappung ist ein ungültiges Layout, kein Kapazitätsfehler.
Tensor.ResizeTo und Verkettung in ein vorhandenes Ziel lehnen eine Null-Stride-Dimension ab, die mehr als ein logisches Element enthält. Leere Ziele und Nullschritte in Singleton-Dimensionen bleiben zulässig.
TensorSpan<T> und ReadOnlyTensorSpan<T> Konstruktoren, die System.Array annehmen, lösen bei inkompatiblen Arrayelementtypen ArrayTypeMismatchException aus. Beschreibbare Tensor-Spans lehnen kovariante Arrays ebenfalls ab; schreibgeschützte Tensor-Spans lassen eine kompatible Kovarianz bei Referenztypen zu.
Art der einschneidenden Änderung
Dies ist eine Verhaltensänderung.
Grund für die Änderung
Bei korrekten Kopien zwischen willkürlich überlappenden gestrideten Tensoren kann eine temporäre Speicherung proportional zum gesamten Tensor erforderlich sein. Explizite Ablehnung vermeidet traversal abhängige Beschädigungen, ohne im Hintergrund vollständige Tensormomentaufnahmen zu allozieren.
Wiederholte Ausgabespeicherorte können keine verschiedenen logischen Ergebnisse darstellen. Die Validierung des Array-Elementtyps verhindert, dass inkompatibler Speicher als T interpretiert wird, und verhindert Schreibvorgänge über kovarianten Array-Speicher.
Empfohlene Maßnahme
Verwenden Sie einen nicht überlappenden Ausgabespeicher oder erstellen Sie explizit eine Momentaufnahme der Quelle vor einer überlappenden Kopie. Im vorherigen Beispiel:
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
Die Momentaufnahme enthält [1, 2, 4, 5]. Bei elementweisen Zielvorgängen können Sie jede überlappende Eingabe sichern oder ein separates Ergebnis allokieren. Ersetzen Sie Broadcast-Ziele durch unabhängig adressierbaren Ausgabespeicher.
Stellen Sie für eine Tensor-Spanne über System.Array einen kompatiblen Elementspeicher bereit. Verwenden Sie für eine schreibbare Ansicht ein Array, das nicht kovariant ist, oder kopieren Sie die Elemente in eine neue T[].
Gehen Sie nicht davon aus, dass eine Try-Kopiermethode keine Ausnahme auslösen kann. Ein false Ergebnis weist auf unzureichende Kapazität oder, für TryCopyTo, inkompatible Shapes hin. Kein Kompatibilitätsschalter stellt arbritäres Überlappungsverhalten wieder her.
Betroffene APIs
- 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.
- Die entsprechenden Kopier- und Flachungsmethoden auf Tensor<T>, TensorSpan<T>und ReadOnlyTensorSpan<T>.
- Zielbezogene elementweise Methoden auf Tensor, einschließlich unärer, binärer und tensor/skalarer Vorgänge.
- System.Numerics.Tensors.Tensor.ResizeTo (alle Überladungen).
- System.Numerics.Tensors.Tensor.Reverse und System.Numerics.Tensors.Tensor.ReverseDimension (Überladungen, die ein Ziel annehmen).
- System.Numerics.Tensors.Tensor.Concatenate (Überladung, die ein Ziel akzeptiert).
-
TensorSpan<T> und ReadOnlyTensorSpan<T> (die beiden Überladungen für jeden Typ, die
System.Arrayakzeptieren).