public interface IHoge {}
public class Hoge : IHoge {}

public class Foo<T> {
    public Foo(T value) {
        this.value = value;
    }
    private T value;
    public static implicit operator Foo<T>(T t) {
        return new Foo<T>(t);
    }
}

public static void Main() {
    Hoge hoge = new Hoge();
    Foo<Hoge> a = hoge;
    Foo<IHoge> b = hoge;
    Foo<IHoge> c = (IHoge)ihoge;  // コンパイルエラー
}

最後のがかなり納得できない。
インターフェイスとのキャスト演算オーバーロードが定義できないのが原因なんだけど。