Tengo una clase genérica que estoy tratando de implementar implícito tipo de casting para. Mientras que la mayoría trabaja, no va a funcionar para la interfaz de fundición. Después de una investigación, he encontrado que hay un error del compilador: «conversión definida por el Usuario desde la interfaz» que se aplica. Aunque entiendo que esto debe ser forzada en algunos casos, lo que estoy tratando de hacer hace parecer un caso legítimo.

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 a utilizar es:

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 un modo satisfactorio por qué me shuouldn no ser capaz de emitir interfaceReferenceToBar implícitamente a Foo<IBar>, ya que en mi caso no es que se está convirtiendo, pero sólo contenía dentro de los Foo?

EDICIÓN:
Parece que la covarianza puede ofrecer la salvación. Esperemos que el de C# 4.0 especificación permite la conversión implícita de tipos de interfaz de uso de la covarianza.

1 Comentario

  1. 57

    La razón que usted no puede hacer esto es porque está expresamente prohibido en la especificación del lenguaje C#:

    Una clase o struct es permitido
    declarar una conversión a partir de una fuente
    tipo S de un tipo de destino T proporcionado todos
    las siguientes son verdaderas:

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

    y

    Definidas por el usuario las conversiones no son
    permite convertir desde o hacia
    interfaz-tipos de. En particular, este
    restricción garantiza que no
    definido por el usuario ocurren transformaciones
    cuando se convierte en un interfaz de tipo,
    y que una conversión a un
    interfaz de tipo sólo tiene éxito si la
    objeto que se convierte en realidad
    implementa el especificado
    interfaz de tipo.

    Fuente

    • Entiendo que es parte de la especificación, la conversión implícita de una interfaz debe ser válido en algunos casos, pero en todos?
    • Estoy de acuerdo con usted, no sé por qué lo hicieron válido para todos los casos. En este caso se puede determinar en tiempo de compilación que el reparto es (o debería ser) válido.
    • Yo creo que la restricción implícita de la interfaz de fundición tiene que ver con cómo la interoperabilidad COM es implementado. COM utiliza QueryInterface, que .Manijas de la RED de forma automática. Permitiendo implícito de la interfaz de conversión podría interferir.
    • puede ser iluminado para leer las respuestas por Adam Houldsworth y Eric Lippert en mi pregunta similar en C# 4.0 contexto.
    • Explica por qué tomaron esta decisión en cualquier lugar?

Dejar respuesta

Please enter your comment!
Please enter your name here