Как я могу преобразовать (ReadOnly)Span в (ReadOnly)Span или наоборот?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу преобразовать (ReadOnly)Span в (ReadOnly)Span или наоборот?

Сообщение Anonymous »

Перечисление вариантов, поскольку Google не дал полезных результатов:
  • Могу ли я преобразовать Span в Span ?
  • Могу ли я преобразовать Span в Span?
  • Могу ли я преобразовать ReadOnlySpan в ReadOnlySpan?
  • Могу ли я преобразовать ReadOnlySpan в ReadOnlySpan< Dog>?
Попытка выполнить любое из этих действий приводит к тем же ошибкам, поэтому я считаю, что это всего лишь один вопрос.
Пример проблемы:

Код: Выделить всё

class Animal { }
class Dog : Animal { }

void Main() {
Dog[] dogs = new Dog[10];
Span dogSpan = dogs.AsSpan(0, 10);

// CS0030 Cannot convert type 'System.Span' to 'System.Span'
Span animalSpan1 = (Span)dogSpan;

// CS0453 The type 'Dog' must be a non-nullable value type in order to use it as parameter 'TFrom' in the generic type or method 'MemoryMarshal.Cast(ReadOnlySpan)'
// CS0453 The type 'Animal' must be a non-nullable value type in order to use it as parameter 'TTo' in the generic type or method 'MemoryMarshal.Cast(ReadOnlySpan)'
Span animalSpan2 = MemoryMarshal.Cast(dogSpan);
}
Я бы согласился с небезопасным приведением и взрывом среды выполнения, если бы я передал Giraffe в Span. Поиск по запросу «span cast items C#» в Google приводит к повторной интерпретации приведения (например, от Span до Span), а это не то, что мне нужно. Если это невозможно, где об этом говорится в документации?
Я использую ReadOnlySpan для представления диапазонов управляемого массива, доступного только для чтения (скажем, Animal[]). Потребители обрабатывают конкретные реализации Animal (например, GiraffeHandler принимает ReadOnlySpan и обрабатывает его как ReadOnlySpan).
Я знаю альтернативное решение было бы выделить копию массива и создать из него диапазон или выполнять приведение каждый раз, когда я вынимаю элемент из диапазона (возможно, путем обертывания диапазона в ref-структуру), но оба из них уродливы. Я бы предпочел привести фактический Span к Span (или наоборот), если это возможно, или узнать, почему иначе это невозможно.

Подробнее здесь: https://stackoverflow.com/questions/743 ... vice-versa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»