Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À compter de .NET 11, les opérations de copie de tenseurs multidimensionnels et celles prenant une destination en paramètre rejettent les configurations de stockage superposées non prises en charge avec ArgumentException avant d’écrire la sortie. Les constructeurs tensor-span valident également le type d’élément du stockage System.Array.
La modification est fournie dans le package System.Numerics.Tensors , y compris ses frameworks cibles pris en charge. La mise à jour du package peut affecter les applications qui ciblent les versions antérieures de .NET. Les API distinctes TensorPrimitives conservent leur contrat de chevauchement existant.
Version introduite
.NET 11
Comportement antérieur
CopyTo, FlattenTo, TryCopyTo et TryFlattenTo ont documenté la prise en charge d’un chevauchement entre le stockage source et le stockage de destination. Les Try méthodes décrites traitaient la source comme si elle avait d’abord été copiée dans un stockage temporaire.
Par exemple, la source et la destination suivantes font référence aux régions qui se chevauchent du même tableau :
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);
Le contrat documenté de type snapshot impliquait que la destination recevrait [1, 2, 4, 5]. Les résultats réels du chevauchement non pris en charge peuvent dépendre de la disposition et de l’ordre de traversée ; l’implémentation n’a pas satisfait de manière fiable à ce contrat.
Les constructeurs qui ont pris System.Array n’ont pas toujours validé si le type d’élément du tableau était compatible avec T.
Nouveau comportement
L’exemple lève ArgumentException avant de copier. Le même chevauchement non pris en charge déclenche également une erreur depuis TryCopyTo et TryFlattenTo lorsque les vérifications de forme et de capacité réussissent.
Le chevauchement pris en charge reste spécifique à l’opération :
| Operation | Prise en charge du chevauchement |
|---|---|
CopyTo et TryCopyTo |
Source et destination denses avec nombres d’éléments égaux ou vues exactement identiques. |
FlattenTo et TryFlattenTo |
Une source dense et la plage de destination. |
| Opérations élément par élément avec destination | Vues d’entrée/sortie identiques sans emplacements de stockage logique répétés. Les entrées de diffusion à chevauchement décalé et à chevauchement sont rejetées. |
Tensor.ResizeTo |
Source et destination dense. Le chevauchement non pris en charge est rejeté. |
| Retour dans la même vue | Inversion sur place dense, ou une inversion sans effet. |
Les Try méthodes de copie retournent falsetoujours, sans copier, lorsque la destination est trop courte.
TryCopyTo retourne également false pour des formes incompatibles. Le chevauchement non pris en charge est une mise en page non valide, et non une défaillance de capacité.
Tensor.ResizeTo et la concaténation dans une destination existante rejettent une dimension à pas nul qui contient plusieurs éléments logiques. Les destinations vides et des pas nuls dans les dimensions singleton restent autorisés.
les constructeurs TensorSpan<T> et ReadOnlyTensorSpan<T> qui prennent System.Array lèvent ArrayTypeMismatchException pour les types d’éléments de tableau incompatibles. Les spans tenseur accessibles en écriture rejettent également les tableaux covariants ; les spans tenseur en lecture seule autorisent la covariance pour les types de référence compatibles.
Type de changement avec rupture de compatibilité
Il s’agit d’un changement comportemental.
Raison du changement
Les copies correctes entre des tenseurs qui se chevauchent arbitrairement peuvent nécessiter un stockage temporaire proportionnel à l’ensemble du tenseur. Le rejet explicite évite la corruption dépendante des traversées sans allouer silencieusement des instantanés du tenseur complet.
Les emplacements de stockage de sortie répétés ne peuvent pas représenter des résultats logiques distincts. La validation de type d’élément de tableau empêche l’interprétation du stockage incompatible en tant que T, et empêche les écritures par le biais d’un stockage de tableau covariant.
Action recommandée
Utilisez le stockage de sortie sans chevauchement ou capturez explicitement la source avant une copie qui se chevauche. Pour l’exemple précédent :
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
L’instantané contient [1, 2, 4, 5]. Pour les opérations élément par élément avec destination, faites une copie temporaire de chaque entrée qui se chevauche ou allouez un résultat distinct. Remplacez les destinations de diffusion par un stockage de sortie adressable indépendamment.
Pour une plage de tenseur sur System.Array, fournissez un stockage d’élément compatible. Pour une vue accessible en écriture, utilisez un tableau qui n’est pas covariant ou copiez les éléments dans un nouveau T[].
Ne supposez pas qu’une méthode de copie Try ne peut pas lever une exception. Un false résultat gère une capacité insuffisante ou, pour TryCopyTo, des formes incompatibles. Aucun commutateur de compatibilité ne restaure le comportement de chevauchement arbitraire.
API affectées
- 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.
- Méthodes de copie et d’aplatissement correspondantes sur Tensor<T>, TensorSpan<T>et ReadOnlyTensorSpan<T>.
- Méthodes élément par élément prenant une destination sur Tensor, y compris les opérations unaires, binaires et tensorielles/scalaires.
- System.Numerics.Tensors.Tensor.ResizeTo (toutes les surcharges).
- System.Numerics.Tensors.Tensor.Reverse et System.Numerics.Tensors.Tensor.ReverseDimension (surcharges qui prennent une destination).
- System.Numerics.Tensors.Tensor.Concatenate (surcharge avec un paramètre de destination).
-
TensorSpan<T> et ReadOnlyTensorSpan<T> (les deux surcharges sur chaque type qui prennent
System.Array).