Возможно ли в С# перегрузить общий оператор приведения следующим образом?

StackOverflow https://stackoverflow.com/questions/1025576

Вопрос

Просто интересно, есть ли способ представить следующий код в 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top