operador implícito que usa interfaces
-
02-07-2019 - |
Pregunta
Tengo una clase genérica para la que estoy tratando de implementar la conversión implícita de tipos. Si bien funciona principalmente, no funcionará para la transmisión de interfaz. Tras una investigación adicional, descubrí que hay un error del compilador: & Quot; Conversión definida por el usuario desde la interfaz & Quot; eso aplica. Si bien entiendo que esto debería hacerse cumplir en algunos casos, lo que estoy tratando de hacer parece un caso legítimo.
Aquí hay 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 para usarlo:
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 alternativa, o alguien puede explicar de manera satisfactoria por qué no debería ser capaz de lanzar interfaceReferenceToBar
implícitamente a Foo<IBar>
, ya que en mi caso no se está convirtiendo, sino que solo está contenido dentro de Foo ?
EDITAR: Parece que la covarianza podría ofrecer la salvación. Esperemos que la especificación C # 4.0 permita la conversión implícita de tipos de interfaz mediante covarianza.
Solución
La razón por la que no puede hacer esto es porque está específicamente prohibido en la especificación del lenguaje C #:
Se permite una clase o estructura para declarar una conversión de una fuente tipo S a un objetivo tipo T proporcionado todos de lo siguiente es cierto:
- ...
- Ni S ni T son
object
o un tipo de interfaz .
y
Las conversiones definidas por el usuario no son permitido convertir desde o hacia tipos de interfaz . En particular, esto restricción asegura que no se producen transformaciones definidas por el usuario al convertir a un tipo de interfaz , y que una conversión a un tipo de interfaz tiene éxito solo si el objeto convertido en realidad implementa el especificado tipo de interfaz .