Tengo una clase genérica para la que intento implementar la conversión de tipo implícita. Si bien funciona principalmente, no funcionará para la conversión de interfaz. Tras una investigación adicional, descubrí que hay un error de compilación: "conversión definida por el usuario desde la interfaz" que se aplica. Si bien entiendo que esto debería aplicarse en algunos casos, lo que trato de hacer parece ser un caso legítimo.operador implícito que usa interfaces
He aquí un ejemplo:
public class Foo<T> where T : IBar
{
private readonly T instance;
public Foo(T instance)
{
this.instance = instance;
}
public T Instance
{
get { return instance; }
}
public static implicit operator Foo<T>(T instance)
{
return new Foo<T>(instance);
}
}
Código utilizarlo:
var concreteReferenceToBar = new ConcreteBar();
IBar intefaceReferenceToBar = concreteReferenceToBar;
Foo<ConcreteBar> concreteFooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work
¿Alguien sabe una solución, o puede alguien explicar de manera satisfactoria por lo que shuouldn't capaz de lanzar interfaceReferenceToBar
implícitamente a Foo<IBar>
, ya que en mi caso no se está convirtiendo, pero solo figura dentro de Foo?
EDITAR: Parece que la covarianza puede ofrecer la salvación. Esperemos que la especificación C# 4.0 permita la conversión implícita de tipos de interfaz utilizando la covarianza.
entiendo que es parte de la especificación, la conversión implícita de una interfaz debería ser inválida en algunos casos, ¿pero en total? –
Estoy de acuerdo con usted, no sé por qué lo invalidaron en todos los casos. En este caso, puede determinar en tiempo de compilación que el elenco es (debería ser) válido. –
I * cree * que la restricción en la conversión de interfaz implícita tiene que ver con cómo se implementa la interoperabilidad COM. COM utiliza QueryInterface, que .NET maneja automáticamente. Permitir la conversión de interfaz implícita interferiría. – Mark