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.

¿Fue útil?

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 .

Fuente

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