Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A partir do .NET 11, as operações multidimensionais de cópia de tensores e as que recebem um destino rejeitam esquemas de armazenamento sobrepostos não suportados antes de escreverem a saída ArgumentException. Os construtores tensor-span também validam o tipo de elemento do armazenamento System.Array.
A alteração é entregue no pacote System.Numerics.Tensors , incluindo os seus frameworks-alvo suportados. Atualizar o pacote pode afetar aplicações que visam versões anteriores de .NET. As APIs separadas TensorPrimitives mantêm o seu contrato de overlap existente.
Versão introduzida
.NET 11
Comportamento anterior
CopyTo, FlattenTo, TryCopyTo, e TryFlattenTo documentaram suporte para armazenamento de origem e destino sobrepostos. Os Try métodos descritos tratavam a origem como se esta tivesse sido primeiro copiada para 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 documentado ao estilo snapshot implicava que o destino receberia [1, 2, 4, 5]. Os resultados reais para sobreposição não suportada podiam depender do layout e da ordem de percurso; a implementação não cumpria de forma fiável esse contrato.
Os construtores que recebiam System.Array não validavam consistentemente se o tipo de elemento do array era compatível com T.
Novo comportamento
O exemplo lança ArgumentException antes de copiar. A mesma sobreposição sem suporte também é gerada por TryCopyTo e TryFlattenTo quando as suas verificações de forma e capacidade são bem-sucedidas.
A sobreposição permitida mantém-se específica da operação:
| Operação | Sobreposição suportada |
|---|---|
CopyTo e TryCopyTo |
Fonte e destino densos com números iguais de elementos, ou visualizações exatamente idênticas. |
FlattenTo e TryFlattenTo |
Uma fonte densa e a extensão de destino. |
| Operações elemento a elemento com destino | Vistas idênticas de entrada/saída sem repetir localizações lógicas de armazenamento. A sobreposição deslocada e as entradas de transmissão sobrepostas são rejeitadas. |
Tensor.ResizeTo |
Origem e destino denso. A sobreposição com stride não suportada é rejeitada. |
| Reversão para a mesma vista | Reversão densa in situ, ou uma reversão no-op. |
Os Try métodos de cópia continuam a devolver false, sem copiar, quando o destino é demasiado curto.
TryCopyTo também retorna false para formas incompatíveis. Sobreposição não suportada é um layout inválido, não uma falha de capacidade.
Tensor.ResizeTo e a concatenação num destino existente rejeitam uma dimensão de passo zero que contenha mais do que um elemento lógico. Destinos vazios e zero avanços em dimensões singleton continuam permitidos.
TensorSpan<T> e os construtores ReadOnlyTensorSpan<T> que tomam System.Array lançam ArrayTypeMismatchException para tipos de elementos de array incompatíveis. Os spans tensoriais graváveis também rejeitam arrays covariantes; os spans tensoriais de apenas leitura permitem covariância de tipo de referência compatível.
Tipo de mudança disruptiva
Trata-se de uma mudança de comportamento.
Motivo da mudança
Cópias corretas entre tensores com stride arbitrariamente sobrepostos podem exigir armazenamento temporário proporcional a todo o tensor. A rejeição explícita evita corrupção dependente da 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 do tipo de elemento do array impede que o armazenamento incompatível seja interpretado como T, e impede escritas através do armazenamento covariante de arrays.
Ação recomendada
Utilize armazenamento de saída sem sobreposição ou capture explicitamente a fonte antes de uma cópia sobreposta. Para o exemplo anterior:
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
O snapshot contém [1, 2, 4, 5]. Para operações elementares com destino, faça snapshot de cada entrada sobreposta ou aloque um resultado separado. Substituir os destinos de broadcast por armazenamentos de saída endereçáveis de forma independente.
Para uma extensão tensorial sobre System.Array, forneça armazenamento de elementos compatível. Para uma vista com escrita, use um array que não seja covariante, ou copie os elementos para um novo T[].
Não presuma que um método de cópia Try não pode gerar uma exceção. Um resultado false indica capacidade insuficiente ou, para TryCopyTo, formas incompatíveis. Nenhum switch 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 correspondentes de copiar e achatar em Tensor<T>, TensorSpan<T>, e ReadOnlyTensorSpan<T>.
- Métodos elemento a elemento com 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 de método que aceitam um destino).
- System.Numerics.Tensors.Tensor.Concatenate (sobrecarga que aceita um destino).
-
TensorSpan<T> e ReadOnlyTensorSpan<T> (as duas sobrecargas em cada tipo que aceitam
System.Array).