Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начиная с .NET 11, многомерные операции копирования Tensor и операции, принимающие место назначения, отклоняют неподдерживаемые макеты хранилища с перекрытием ArgumentException перед записью выходных данных. Конструкторы Tensor-span также проверяют тип элемента хранилища System.Array.
Это изменение поставляется в пакете System.Numerics.Tensors, включая поддерживаемые целевые платформы .NET. Обновление пакета может повлиять на приложения, предназначенные для более ранних .NET версий.
TensorPrimitives Отдельные API сохраняют существующие условия пересечения.
Представленная версия
.NET 11
Предыдущее поведение
CopyTo, FlattenTo, TryCopyTo и TryFlattenTo документировали поддержку перекрывающихся исходных и целевых хранилищ. Описанные Try методы были представлены как обрабатывающие источник, как если бы он сначала был скопирован во временное хранилище.
Например, следующие исходная и целевая области относятся к перекрывающимся регионам одного массива:
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);
Документированный контракт в стиле моментального снимка подразумевает, что получатель получит [1, 2, 4, 5]. Фактические результаты для неподдерживаемых перекрытий могут зависеть от структуры и порядка обхода; реализация не всегда надежно соответствовала такому контракту.
Конструкторы, принимавшие System.Array, не всегда проверяли, совместим ли тип элемента массива с T.
Новое поведение
Этот пример генерирует ArgumentException перед копированием. Те же неподдерживаемые перекрытия также выбрасываются в TryCopyTo и TryFlattenTo, когда проверки их формы и вместимости выполняются успешно.
Поддерживаемые перекрытия по-прежнему зависят от операции:
| Операция | Поддерживаемое перекрытие |
|---|---|
CopyTo и TryCopyTo. |
Плотные исходный и целевой массивы с равным числом элементов или в точности идентичные виды. |
FlattenTo и TryFlattenTo. |
Плотно упакованный источник и конечный диапазон. |
| Поэлементные операции с аргументом назначения | Идентичные представления входных и выходных данных без повторяющихся логических мест хранения. Широковещательные входные данные со смещённым перекрытием и перекрывающиеся широковещательные входные данные отклоняются. |
Tensor.ResizeTo |
Плотные исходные и конечные данные. Неподдерживаемые перекрытия с шагом отклоняются. |
| Разворот в том же виде | Плотное обращение или обращение на месте без изменений. |
Методы Try копирования по-прежнему возвращают false без копирования, если целевой буфер слишком мал.
TryCopyTo также возвращает false для несовместимых форм. Неподдерживаемое перекрытие является недопустимой компоновкой, а не сбоем из-за нехватки ресурсов.
Tensor.ResizeTo и конкатенация в существующий целевой объект отклоняют измерение с нулевым шагом, содержащее более одного логического элемента. Пустые приёмники и нулевые шаги в единичных измерениях остаются допустимыми.
TensorSpan<T> и ReadOnlyTensorSpan<T> конструкторы, принимающие System.Array, выдают исключение ArrayTypeMismatchException для несовместимых типов элементов массива. Тензорные spans, доступные для записи, также отклоняют ковариантные массивы; тензорные spans только для чтения допускают ковариантность совместимых ссылочных типов.
Тип разрушающего изменения
Причина изменения
Корректное копирование между произвольно перекрывающимися тензорами со страйдами может потребовать временной памяти, пропорциональной всему тензору. Явный отказ позволяет избежать повреждения, зависящего от обхода, без автоматического выделения моментальных снимков полного тензора.
Повторяющиеся расположения хранилища выходных данных не могут представлять отдельные логические результаты. Проверка типа элементов массива предотвращает интерпретацию несовместимого хранилища как хранилища элементов типа T и предотвращает запись через ковариантное хранилище массива.
Рекомендуемое действие
Используйте неперекрывающееся выходное хранилище или явно создайте снимок источника перед перекрывающейся копией. В предыдущем примере:
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
Моментальный снимок содержит [1, 2, 4, 5]. Для поэлементных операций, принимающих целевой аргумент, создайте копию каждого перекрывающегося входного аргумента или выделите отдельный результат. Замените назначения трансляции на независимо адресуемое хранилище выходных данных.
Для тензорного диапазона по System.Array укажите совместимое хранилище элементов. Для представления с возможностью записи используйте массив, который не является ковариантным, или скопируйте элементы в новое T[].
Не предполагайте, что метод копирования Try не может выбросить исключение. Результат false обрабатывает недостаточную емкость или, для TryCopyTo, несовместимые формы. Параметр совместимости не восстанавливает поведение произвольного перекрытия.
Затронутые API
- 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.
- Соответствующие методы копирования и уплощения в Tensor<T>, TensorSpan<T>, а также ReadOnlyTensorSpan<T>.
- Поэлементные методы с аргументом назначения для Tensor, включая унарные, двоичные и операции тензор/скаляр.
- System.Numerics.Tensors.Tensor.ResizeTo (все перегрузки).
- System.Numerics.Tensors.Tensor.Reverse и System.Numerics.Tensors.Tensor.ReverseDimension (перегрузки, которые принимают целевой объект).
- System.Numerics.Tensors.Tensor.Concatenate (перегрузка, принимающая пункт назначения).
-
TensorSpan<T> и ReadOnlyTensorSpan<T> (две перегрузки для каждого типа, которые принимают
System.Array).