niejawny operator używający interfejsów
Mam klasę ogólną, której próbuję zaimplementować rzutowanie typu niejawnego. Chociaż działa głównie, nie będzie działać przy rzutowaniu interfejsu. Po dalszym badaniu odkryłem, że występuje błąd kompilatora: „Konwersja zdefiniowana przez użytkownika z interfejsu”, która ma zastosowanie. Rozumiem, że w niektórych przypadkach powinno to być egzekwowane, ale to, co próbuję zrobić, wydaje się uzasadnione.
Oto przykład:
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);
}
}
Kod, aby go użyć:
var concreteReferenceToBar = new ConcreteBar();
IBar intefaceReferenceToBar = concreteReferenceToBar;
Foo<ConcreteBar> concreteFooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work
Czy ktoś zna obejście problemu lub czy ktoś może wyjaśnić w zadowalający sposób, dlaczego nie powinienem być w stanie rzucaćinterfaceReferenceToBar
niejawnie doFoo<IBar>
, ponieważ w moim przypadku nie jest konwertowany, ale zawarty w Foo?
EDYTOWAĆ: Wygląda na to, że kowariancja może zaoferować zbawienie. Miejmy nadzieję, że specyfikacja C # 4.0 pozwala na niejawne rzutowanie typów interfejsów przy użyciu kowariancji.