Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de .NET 11, las operaciones de copia de Tensor multidimensional y que aceptan un destino rechazan los diseños de almacenamiento superpuestos no admitidos con ArgumentException antes de escribir la salida. Los constructores tensor-span también validan el tipo de elemento del almacenamiento System.Array.
El cambio se entrega en el paquete System.Numerics.Tensors , incluidos sus marcos de destino admitidos. La actualización del paquete puede afectar a las aplicaciones que tienen como destino versiones anteriores de .NET. Las API independientes TensorPrimitives conservan su contrato de solapamiento existente.
Versión introducida
.NET 11
Comportamiento anterior
CopyTo, FlattenTo, TryCopyTo y TryFlattenTo documentaron la compatibilidad con el almacenamiento de origen y destino superpuestos. Los Try métodos descritos trataban la fuente como si primero se hubiera copiado en el almacenamiento temporal.
Por ejemplo, el siguiente origen y destino hacen referencia a las regiones superpuestas del mismo 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);
El contrato de estilo de instantánea documentado implicaba que el destino recibiría [1, 2, 4, 5]. Los resultados reales de la superposición no admitida podrían depender del diseño y el orden de recorrido; la implementación no cumplía ese contrato de forma confiable.
Los constructores que aceptaban System.Array no validaban de forma coherente si el tipo de elemento de la matriz era compatible con T.
Nuevo comportamiento
El ejemplo lanza ArgumentException antes de copiar. La misma superposición no admitida también se lanza desde TryCopyTo y TryFlattenTo cuando sus comprobaciones de forma y capacidad se realizan correctamente.
La superposición admitida sigue siendo específica de la operación:
| Operation | Superposición admitida |
|---|---|
CopyTo y TryCopyTo |
Origen y destino densos con recuentos de elementos iguales o con vistas exactamente idénticas. |
FlattenTo y TryFlattenTo |
Una fuente de origen densa y el tramo de destino. |
| Operaciones elemento a elemento con destino | Vistas de entrada y salida idénticas sin ubicaciones lógicas de almacenamiento repetidas. Se rechazan el solapamiento desplazado y las entradas de difusión superpuestas. |
Tensor.ResizeTo |
Origen y destino completos. Se rechaza la superposición con stride no admitida. |
| Retroceso en la misma vista | Inversión densa in situ, o una inversión sin operación. |
Los Try métodos de copia siguen devolviendo false, sin copiar, cuando el destino es demasiado corto.
TryCopyTo también devuelve false para formas incompatibles. La superposición no admitida es un diseño no válido, no un error de capacidad.
Tensor.ResizeTo y la concatenación en un destino existente rechazan una dimensión de paso cero que contiene más de un elemento lógico. Se permiten destinos vacíos y strides cero en dimensiones singleton.
Los constructores TensorSpan<T> y ReadOnlyTensorSpan<T> que toman System.Array como origen generan ArrayTypeMismatchException para tipos de elementos de matriz incompatibles. Los intervalos de tensor de escritura también rechazan arrays covariantes; los intervalos de tensor de solo lectura permiten la covarianza compatible de tipos de referencia.
Tipo de cambio disruptivo
Se trata de un cambio de comportamiento.
Motivo del cambio
Las copias correctas entre tensores estridados superpuestos arbitrariamente pueden requerir almacenamiento temporal proporcional a todo el tensor. El rechazo explícito evita la corrupción dependiente del recorrido sin asignar instantáneas de tensor completas de forma silenciosa.
Las ubicaciones de almacenamiento de salida repetidas no pueden representar resultados lógicos distintos. La validación del tipo de elemento de matriz impide que el almacenamiento incompatible se interprete como T y evita que las escrituras se realicen a través del almacenamiento covariante de matrices.
Acción recomendada
Utilice el almacenamiento de salida sin superposición o realice una instantánea explícita del origen antes de una copia superpuesta. Para el ejemplo anterior:
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
La instantánea contiene [1, 2, 4, 5]. En el caso de las operaciones elementales con destino, realice una instantánea de cada entrada superpuesta o asigne un resultado independiente. Reemplace los destinos de difusión por almacenamiento de salida con direccionamiento independiente.
Para un span de tensor sobre System.Array, proporcione almacenamiento de elementos compatible. Para una vista de escritura, use un array que no sea covariante o copie los elementos en un nuevo T[].
No suponga que un método de copia Try no pueda generar una excepción. Un resultado false indica una capacidad insuficiente o, para TryCopyTo, formas incompatibles. Ningún modificador de compatibilidad restaura un comportamiento de superposición arbitraria.
Las APIs afectadas
- 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étodos de copia y aplanación correspondientes en Tensor<T>, TensorSpan<T>y ReadOnlyTensorSpan<T>.
- Métodos elementwise con destino en Tensor, incluidas las operaciones unarias, binarias y tensor/escalar.
- System.Numerics.Tensors.Tensor.ResizeTo (todas las sobrecargas).
- System.Numerics.Tensors.Tensor.Reverse y System.Numerics.Tensors.Tensor.ReverseDimension (sobrecargas que aceptan un destino).
- System.Numerics.Tensors.Tensor.Concatenate (sobrecarga que acepta un destino).
-
TensorSpan<T> y ReadOnlyTensorSpan<T> (las dos sobrecargas de cada tipo que aceptan
System.Array).