operatore implicito che utilizza le interfacce
-
02-07-2019 - |
Domanda
Ho una classe generica per cui sto cercando di implementare il cast di tipi impliciti. Mentre funziona principalmente, non funzionerà per il casting dell'interfaccia. In seguito a ulteriori accertamenti, ho riscontrato che si è verificato un errore del compilatore: & Quot; Conversione definita dall'utente dall'interfaccia & Quot; questo vale. 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<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);
}
}
Codice per usarlo:
var concreteReferenceToBar = new ConcreteBar();
IBar intefaceReferenceToBar = concreteReferenceToBar;
Foo<ConcreteBar> concreteFooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work
Qualcuno conosce una soluzione alternativa o qualcuno può spiegare in modo soddisfacente perché non dovrei essere in grado di eseguire il cast interfaceReferenceToBar
implicitamente in Foo<IBar>
, poiché nel mio caso non viene convertito, ma contenuto solo in Foo ?
Modifica Sembra che la covarianza possa offrire la salvezza. Speriamo che la specifica C # 4.0 consenta il cast implicito di tipi di interfaccia usando la covarianza.
Soluzione
Il motivo per cui non puoi farlo è perché è specificamente vietato nelle specifiche del linguaggio C #:
È consentita una classe o struttura dichiarare una conversione da una fonte digitare S a un target di tipo T fornito tutto quanto segue è vero:
- ...
- Né S né T sono
object
o un tipo di interfaccia .
e
Le conversioni definite dall'utente non lo sono autorizzato a convertire da o a interfaccia tipi . In particolare questo la restrizione assicura che no si verificano trasformazioni definite dall'utente durante la conversione in un tipo di interfaccia , e che una conversione in un tipo di interfaccia ha esito positivo solo se il l'oggetto viene convertito effettivamente implementa il specificato interfaccia di tipo .