Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A partir do .NET 11, as operações de cópia multidimensional e de gravação em destino do Tensor rejeitam layouts ArgumentException de armazenamento sobrepostos sem suporte antes de gravarem a saída. Os construtores de tensor-span também validam o tipo de elemento do armazenamento System.Array.
A alteração é disponibilizada no pacote System.Numerics.Tensors, incluindo seus frameworks de destino compatíveis. A atualização do pacote pode afetar aplicativos destinados a versões de .NET anteriores. As APIs separadas TensorPrimitives mantêm o contrato de sobreposição existente.
Versão introduzida
.NET 11
Comportamento anterior
CopyTo, FlattenTo, TryCopyTo e TryFlattenTo documentaram suporte para sobreposição de armazenamento de origem e destino. Os Try métodos descritos lidavam com a fonte como se ela tivesse sido copiada primeiro para o armazenamento temporário.
Por exemplo, a seguinte origem e destino referem-se a regiões sobrepostas do mesmo 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);
O contrato no estilo snapshot documentado implicava que o destino da cópia receberia [1, 2, 4, 5]. Os resultados reais para sobreposição não suportada podem depender do layout e da ordem de passagem; a implementação não atendeu de forma confiável a esse contrato.
Os construtores que recebiam System.Array não validavam consistentemente se o tipo de elemento da matriz era compatível com T.
Novo comportamento
O exemplo lança ArgumentException antes de copiar. A mesma sobreposição sem suporte também é lançada por TryCopyTo e TryFlattenTo quando as verificações de forma e capacidade têm êxito.
A sobreposição suportada permanece específica à operação:
| Operação | Sobreposição suportada |
|---|---|
CopyTo e TryCopyTo |
Origem e destino densos com contagens de elementos iguais ou exibições exatamente idênticas. |
FlattenTo e TryFlattenTo |
Uma fonte densa e o span de destino. |
| Operações elementwise com destino | Exibições de entrada/saída idênticas sem locais lógicos de armazenamento repetidos. As entradas de transmissão sobrepostas e com sobreposição deslocada são rejeitadas. |
Tensor.ResizeTo |
Origem e destino compactos. A sobreposição com stride não suportada é rejeitada. |
| Retorno para a mesma visualização | Reversão densa in-place, ou uma reversão no-op. |
Os Try métodos de cópia ainda retornam false, sem copiar, quando o destino é muito curto.
TryCopyTo também retorna false para formas incompatíveis. A sobreposição sem suporte é um layout inválido, não uma falha de capacidade.
Tensor.ResizeTo e a concatenação em um destino existente rejeitam uma dimensão de passo zero que contém mais de um elemento lógico. Destinos vazios e zero passos em dimensões singleton permanecem permitidos.
TensorSpan<T> e ReadOnlyTensorSpan<T> construtores que recebem System.Array lançam ArrayTypeMismatchException para tipos de elementos de matriz incompatíveis. Os spans de tensor graváveis também rejeitam arrays covariantes; os spans de tensor somente leitura permitem covariância compatível de tipos de referência.
Tipo de mudança disruptiva
Essa é uma mudança comportamental.
Motivo da alteração
As cópias corretas entre tensores estriados com sobreposição arbitrária podem exigir armazenamento temporário proporcional ao tensor inteiro. A rejeição explícita evita a corrupção dependente de travessia sem alocar silenciosamente instantâneos de tensor completo.
Locais de armazenamento de saída repetidos não podem representar resultados lógicos distintos. A validação de tipo de elemento de matriz impede que o armazenamento incompatível seja interpretado como Te impede gravações por meio do armazenamento de matriz covariante.
Ação recomendada
Use o armazenamento de saída não sobreposto ou faça explicitamente uma captura da origem antes de uma cópia sobreposta. No exemplo anterior:
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
O instantâneo contém [1, 2, 4, 5]. Para operações elementwise com destino, faça uma cópia instantânea de cada entrada sobreposta ou aloque um resultado separado. Substitua os destinos de difusão por destinos de saída endereçáveis independentemente.
Para um intervalo de tensor, System.Arrayforneça o armazenamento de elementos compatíveis. Para uma visão gravável, use um array que não seja covariante ou copie os elementos para um novo T[].
Não suponha que um método de cópia Try não possa lançar uma exceção. Um false resultado indica capacidade insuficiente ou, para TryCopyTo, formas incompatíveis. Nenhum comutador de compatibilidade restaura o comportamento de sobreposição arbitrária.
APIs afetadas
- 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.
- Os métodos de cópia e nivelamento correspondentes em Tensor<T>, TensorSpan<T>e ReadOnlyTensorSpan<T>.
- Métodos elementais que recebem um destino em Tensor, incluindo operações unárias, binárias e de tensor/escalar.
- System.Numerics.Tensors.Tensor.ResizeTo (todas as sobrecargas).
- System.Numerics.Tensors.Tensor.Reverse e System.Numerics.Tensors.Tensor.ReverseDimension (sobrecargas que recebem um destino).
- System.Numerics.Tensors.Tensor.Concatenate (sobrecarga que aceita um destino).
-
TensorSpan<T> e ReadOnlyTensorSpan<T> (as duas sobrecargas em cada tipo que recebem
System.Array).