Frage

Ich habe eine generische Klasse, die ich für implizite Typumwandlung zu implementieren bin versucht. Während es meistens funktioniert, wird es nicht für die Schnittstelle Gießen arbeiten. Bei der weiteren Untersuchung fand ich, dass es einen Compiler-Fehler: „Benutzerdefinierte Umwandlung von Interface“, das gilt. Während ich, dass dies verstehen sollte in einigen Fällen durchgesetzt werden, was ich versuche, wie ein legitimer Fall zu tun scheint.

Hier ist ein Beispiel:

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);
    }
}

-Code zu verwenden, um es:

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

Kennt jemand eine Abhilfe, oder kann jemand in befriedigender Weise erklären, warum ich in der Lage sein shuouldn't interfaceReferenceToBar implizit Foo<IBar> zu werfen, da in meinem Fall ist es nicht umgesetzt wird, sondern nur innerhalb Foo enthalten?

EDIT: Es sieht aus wie Kovarianz Heil bieten könnte. Lassen Sie uns hoffen, dass die C # 4.0-Spezifikation für implizite Gießen von Schnittstellentypen erlaubt mit Kovarianz.

War es hilfreich?

Lösung

Der Grund, warum Sie kann dies nicht tun, weil es speziell in der Sprache C # Spezifikation verboten ist:

  

Eine Klasse oder Struktur ist erlaubt   eine Umwandlung von einer Quelle erklären   Typ S auf einen Zieltyp T alle zur Verfügung gestellt   die folgenden Bedingungen erfüllt sind:

     
      
  • ...
  •   
  • Weder S noch T ist object oder ein interface-type .
  •   

und

  

Benutzerdefinierte Konvertierungen sind nicht   erlaubt zu konvertieren von oder nach    Interface-Typen . Insbesondere diese   Einschränkung gewährleistet, dass keine   benutzerdefinierte Transformationen auftreten   wenn sie einen Interface-Typen Umwandlung ,   und daß eine Umwandlung in ein    interface-type ist nur erfolgreich, wenn die   Objekt umgewandelt wird tatsächlich   implementiert die angegebene    interface-type .

Quelle

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top