Возможно ли в C # перегрузить универсальный оператор приведения следующим образом? - PullRequest
16 голосов
/ 22 июня 2009

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

Спасибо

Ответы [ 3 ]

20 голосов
/ 22 июня 2009

Операторы преобразования не могут быть универсальными. В разделе спецификации 10.10 приведен формат оператора-оператора преобразования:

<i>conversion-operator-declarator</i>:
    implicit   operator   <i>type</i>   (   <i>type</i>   <i>identifier</i>   )
    explicit   operator   <i>type</i>   (   <i>type</i>   <i>identifier</i>   )

Сравните это, скажем, с заголовком метода:

Метод заголовок : атрибуты опт модификаторы метода опт частичный опт тип возврата имя-члена список параметров типа опция ( список формальных параметров опция ) Тип-параметр-ограничители-положение неавтоматический

(Извините за форматирование - не уверен, как это сделать лучше.)

Обратите внимание, что формат оператора не включает список параметров типа или ограничения параметров типа.

2 голосов
/ 22 июня 2009

Ваш код сводится к строке: return new Foo<U>((U)a.Item)

Когда вы пытаетесь присвоить базовый класс унаследованному классу, что невозможно.

Допустим, T (базовый класс) имеет тип Stream, а U имеет тип MemoryStream (унаследованный класс), вы не можете присвоить Stream переменной типа MemoryStream.

0 голосов
/ 22 июня 2009

Я думаю, что короткий ответ: «Невозможно. Попробуйте использовать метод вместо»

Также, кажется, обманывают этот вопрос Решение для перегруженного операторного ограничения в .NET generics

...