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

Просто интересно, есть ли так или иначе представлять следующий код в C # 3.5:

<code>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)
    }
}
</code>

Спасибо

Ответы на вопрос(3)

return new Foo<U>((U)a.Item)

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

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

 LaserJesus22 июн. 2009 г., 07:56
... Если вы возьмете код, который у меня есть, и выразите его как метод, а не перегрузку оператора, он скомпилируется
 LaserJesus22 июн. 2009 г., 07:54
Конечно, вы можете. Если ссылка маскирует объект как поток, но это не влияет на MemoryStream, то вы, безусловно, можете преобразовать его в поток памяти. Это допустимый метод, проблема в том, что вы не можете указать общие ограничения на перегрузку оператора ...
Решение Вопроса

10.10 приведен формат оператора-оператора преобразования:

conversion-operator-declarator:
    implicit   operator   type   (   type   identifier   )
    explicit   operator   type   (   type   identifier   )

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

method-header: attributesopt method-modifiersopt partialopt return-type member-name type-parameter-listopt ( formal-parameter-listopt ) type-parameter-constraints-clausesopt

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

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

 22 июн. 2009 г., 16:53
И даже если бы мы поддерживали определенные пользователем общие преобразования, это все равно было бы незаконным. Недопустимо определять преобразование, которое заменяет встроенное преобразование. Это было бы так, если бы T и U были одного типа; вы бы заменить преобразование личности.
 16 мар. 2010 г., 18:51
Поскольку приведение решает компилятор, если бы T и U были одного типа, то он не использовал бы приведенное пользователем приведение и был бы легальным.

что короткий ответ "Невозможно. Попробуйте вместо этого использовать метод & quot;

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

Ваш ответ на вопрос