impliziter Operator-Schnittstellen unter Verwendung von
-
02-07-2019 - |
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.
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 .