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.

È stato utile?

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 .

Source

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top