2010-01-23 14 views
5

¿Por qué esta conversión no funciona?Conversión implícita de operador y genéricos

public interface IMyInterface 
{ 
} 

public interface IMyInterface2 : IMyInterface 
{ 
} 

public class MyContainer<T> where T : IMyInterface 
{ 
    public T MyImpl {get; private set;} 
    public MyContainer() 
    { 
      MyImpl = Create<T>(); 
    } 
    public static implicit T (MyContainer<T> myContainer) 
    { 
     return myContainer.MyImpl; 
    } 
} 

Cuando uso mi clase que provoca un error de compilación tiempo:

IMyInterface2 myImpl = new MyContainer<IMyInterface2>(); 

No se puede convertir de MyContainer <IMyInterface2> a IMyInterface2 ... hmmmm

+2

Me encontré con este mismo problema. No es un error en el compilador, sino una parte documentada de la especificación. Ver http://stackoverflow.com/questions/1208796/c-compiler-bug-why-doesnt-this-implicit-user-defined-conversion-compile Un miembro respetado del equipo compilador de C# agregó una respuesta a lo anterior pregunta y agregó: "esta es una parte muy, muy confusa de la especificación". –

+0

Gracias por el seguimiento. Eso es útil. No pensé que era un error, pero posiblemente algo que no entendí sobre la especificación, que resultó ser. Es una mierda porque habría hecho que mi código fuera mucho más limpio ... bueno. Supongo que solo escribiré mi propio idioma: P –

+0

Te escucho. Tengo algunas estructuras como NonNull y Maybe , y la conversión a/desde estos tipos sería mucho más limpia si la especificación estuviera permitida para este escenario. Desearía que cambiasen las especificaciones; Prefiero tener la posibilidad de conversiones menos baratas y habilitar este escenario de conversión implícita. –

Respuesta

5

no se puede definir una conversión implícita a una interfaz. Por lo tanto, su operación implícita genérica no va a ser válida para las interfaces. Ver blackwasp.co.uk

You may not create operators that convert a class to a defined interface. If conversion to an interface is required, the class must implement the interface.

Es posible que sólo tenga que terminar escribiendo al siguiente, sin implícita magia:

IMyInterface2 myImpl = new MyContainer<IMyInterface2>().MyImpl; 
3

Tiene que ver con el hecho de que IMyInterface2 es una interfaz, si es que se sustituya con

public class MyClass2 : IMyInterface 
{ 
} 

funciona.

Aquí está la referencia, 10.9.3

Cuestiones relacionadas