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 y de toma de destino de tensores multidimensionales 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 superposición existente.
Versión introducida
.NET 11
Comportamiento anterior
CopyTo, FlattenTo, TryCopyTo y TryFlattenTo documentaban la compatibilidad con el origen y el destino superpuestos. Los métodos Try descritos manejaban el origen como si primero se hubiera copiado a un 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 produce ArgumentException antes de copiar. La misma superposición no admitida también produce excepciones desde TryCopyTo y TryFlattenTo cuando sus comprobaciones de forma y capacidad se superan 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 |
Un origen denso y el span de destino. |
| Operaciones de toma de destino por elementos | Vistas de entrada y salida idénticas sin ubicaciones lógicas de almacenamiento repetidas. Las entradas de superposición desplazada y de difusión superpuesta se rechazan. |
Tensor.ResizeTo |
Origen y destino densos. Se rechaza la superposición con stride no admitida. |
| Reversión en la misma vista | Reversión in situ densa, o reversió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 spans de tensor grabables también rechazan las matrices covariantes; los spans 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]. Para las operaciones de toma de destino por elementos, capture una instantánea de cada entrada superpuesta o asigne un resultado independiente. Reemplace los destinos de difusión por almacenamiento de salida direccionable de forma 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 gestiona la capacidad insuficiente o, para TryCopyTo, las formas incompatibles. Ningún conmutador de compatibilidad restaura el 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 de toma de destino por elementos en Tensor, incluidas las operaciones unarias, binarias y de 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).