operatore implicito che utilizza interfacce

Ho una class generica che sto cercando di implementare il tipo di casting implicito per. Mentre funziona principalmente, non funzionerà per il cast dell’interfaccia. Dopo ulteriori indagini, ho trovato che c’è un errore del compilatore: “Conversione definita dall’utente dall’interfaccia” che si applica. Mentre capisco che questo dovrebbe essere applicato in alcuni casi, quello che sto cercando di fare sembra un caso legittimo.

Ecco un esempio:

public class Foo 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 instance) { return new Foo(instance); } } 

Codice per usarlo:

 var concreteReferenceToBar = new ConcreteBar(); IBar intefaceReferenceToBar = concreteReferenceToBar; Foo concreteFooFromConcreteBar = concreteReferenceToBar; Foo fooFromConcreteBar = concreteReferenceToBar; Foo fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work 

Qualcuno sa una soluzione, o qualcuno può spiegare in modo soddisfacente perché non dovrei essere in grado di trasmettere interfaceReferenceToBar implicitamente a Foo , dal momento che nel mio caso non viene convertito, ma solo contenuto in Foo?

EDIT: Sembra che la covarianza potrebbe offrire la salvezza. Speriamo che le specifiche C # 4.0 consentano il cast implicito di tipi di interfaccia usando covarianza.

Il motivo per cui non è ansible farlo è perché è espressamente vietato nelle specifiche del linguaggio C #:

Una class o una struttura è autorizzata a dichiarare una conversione da un tipo di origine S a un tipo di destinazione T purché tutte le seguenti condizioni siano vere:

  • Né S né T è un object o un tipo di interfaccia .

e

Le conversioni definite dall’utente non possono convertire da o verso tipi di interfaccia . In particolare, questa restrizione garantisce che non si verifichino trasformazioni definite dall’utente durante la conversione in un tipo di interfaccia e che una conversione in un tipo di interfaccia abbia esito positivo solo se l’object che viene convertito implementa effettivamente il tipo di interfaccia specificato.

fonte