Ich habe eine generische Klasse, für die ich implizite Typ Casting implementieren möchte. Während es meistens funktioniert, wird es nicht für das Interface-Casting funktionieren. Bei weiteren Untersuchungen stellte ich fest, dass ein Compiler-Fehler vorliegt: "Benutzerdefinierte Konvertierung von der Schnittstelle". Während ich verstehe, dass dies in einigen Fällen erzwungen werden sollte, scheint das, was ich versuche, wie ein legitimer Fall zu sein.impliziter Operator mit Schnittstellen
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, es zu benutzen:
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 shuouldn't ich in der Lage sein zu werfen interfaceReferenceToBar
implizit zu Foo<IBar>
, denn in meinem Fall wird es nicht konvertiert, sondern nur in Foo enthalten?
EDIT: Es sieht aus wie Kovarianz könnte Rettung bieten. Hoffen wir, dass die C# 4.0-Spezifikation implizites Casting von Schnittstellentypen mit Kovarianz ermöglicht.
Ich verstehe, dass es Teil der ist Spezifikation, implizites Casting einer Schnittstelle sollte in einigen Fällen, aber insgesamt ungültig sein? –
Ich stimme dir zu, ich weiß nicht, warum sie es für alle Fälle ungültig gemacht haben. In diesem Fall können Sie zur Kompilierzeit feststellen, dass die Besetzung gültig ist (sein sollte). –
Ich * glaube *, dass die Einschränkung impliziten Interface-Casting damit zu tun hat, wie COM-Interop implementiert ist. COM verwendet QueryInterface, das von .NET automatisch behandelt wird. Das Zulassen einer impliziten Schnittstellenumsetzung würde stören. – Mark