¿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
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". –
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 –
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. –