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.

questionAnswers(1)

yourAnswerToTheQuestion