c# generics compiler-construction casting implicit-conversion

c# - operador implícito usando interfaces



generics compiler-construction (1)

Tengo una clase genérica para la que estoy intentando implementar la conversión de tipos 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.

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 puede alguien explicar de manera satisfactoria por qué no podría 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 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.


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 que una clase o estructura declare una conversión de un tipo de origen S a un tipo de destino T siempre que se cumplan todas las condiciones siguientes:

  • ...
  • Ni S ni T son un object o un tipo de interfaz .

y

Las conversiones definidas por el usuario no se pueden convertir desde o a tipos de interfaz . En particular, esta restricción garantiza que no se produzcan transformaciones definidas por el usuario al convertir a un tipo de interfaz , y que una conversión a un tipo de interfaz solo tenga éxito si el objeto que se está convirtiendo realmente implementa el tipo de interfaz especificado.

Source