Pregunta

Sólo me preguntaba si hay de todos modos para representar el siguiente código en 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)
    }
}

Gracias

¿Fue útil?

Solución

Los operadores de conversión no pueden ser genéricos. De la sección de especificaciones 10.10, aquí está el formato de un declarador de operador de conversión:

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

Compare esto con, digamos, un encabezado de método:

  

encabezado del método :    atributos opt método-modificadoresopt parcial opt tipo de retorno    nombre-miembro tipo-parámetro- listaopt ( lista-parámetros-formal opt )    type-parameter-constraints-clausesopt

(Perdón por el formato, no estoy seguro de cómo hacerlo mejor).

Tenga en cuenta que el formato del operador no incluye una lista de parámetros de tipo o restricciones de parámetros de tipo.

Otros consejos

El código se reduce a la línea: return new Foo<U>((U)a.Item)

Cuando intenta asignar una clase base para una clase heredada, lo cual es imposible.

Digamos que T (clase base) es de tipo Stream y U es de tipo MemoryStream (heredado de la clase), no se puede asignar un Stream a una variable de tipo MemoryStream.

Creo que la respuesta corta es " No es posible. Intente usar un método en su lugar & Quot;

También parece ser engañado de esta pregunta Solución para restricciones de operador sobrecargadas en genéricos .NET

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top