Возможно ли в С# перегрузить общий оператор приведения следующим образом?
-
06-07-2019 - |
Вопрос
Просто интересно, есть ли способ представить следующий код в C# 3.5:
public struct Foo<T> {
public Foo(T item) {
this.Item = item;
}
public T Item { get; set; }
public static explicit operator Foo<U> ( Foo<T> a )
where U : T {
return new Foo<U>((U)a.Item)
}
}
Спасибо
Решение
Операторы преобразования не могут быть универсальными.Из раздела спецификации 10.10 приведен формат оператора-декларатора преобразования:
оператор преобразования-декларатор: implicit operator тип ( тип идентификатор ) explicit operator тип ( тип идентификатор )
Сравните это, скажем, с заголовком метода:
заголовок метода: атрибутывыбрать методы-модификаторывыбрать частичныйвыбрать возвращаемый тип имя участника список-тип-параметроввыбрать ( список формальных параметроввыбрать ) условия-ограничения-типа-параметравыбрать
(Извините за форматирование, не знаю, как лучше сделать.)
Обратите внимание, что формат оператора не включает список параметров типа или ограничения параметров типа.
Другие советы
Ваш код сводится к строке: return new Foo<U>((U)a.Item)
Когда вы пытаетесь присвоить базовый класс унаследованному классу, что невозможно.
Допустим, T (базовый класс) имеет тип Stream
и U имеет тип MemoryStream
(унаследованный класс), вы не можете назначить Stream
к переменной типа MemoryStream
.
Я думаю, что краткий ответ: «Невозможно.Вместо этого попробуйте использовать метод"
Также кажется, что этот вопрос обманутРешение для ограничения перегруженного оператора в дженериках .NET