0

C#4.0仕様セクション6.1.6から:

暗黙の参照変換は次のとおりです。

[...]

インターフェイスまたはデリゲート型T0への暗黙のIDまたは参照変換があり、T0がTへのバリアント変換可能(13.1.3.2)である場合、任意の参照型からインターフェイスまたはデリゲート型Tへ。

Vladimir Reshetnikovは、からList<string>への暗黙の参照変換があることを示していIEnumerable<object>ます。しかし、これをユーザー定義のタイプにどのように適用できますか(それも可能ですか)?

暗黙の演算子、カスタム派生型、およびそれらのいくつかのバリエーションを試しましたが、シーンリオを再現できません。私は持っています:

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<object> specialClassConversion = new List<string>();
        IEnumerable<A> userdefinedTypeConversion = new List<B>();
        A implicitConversion = new B();//varience-convertible
        IC<A> explicitConversion = (IC<A>)new D<B>();//OK, varience-convertible
        IC<A> implicitConversion2 = new D<B>();//does not compile
    }
}

class A { }

class B : A { }

interface IC<T> { }    

class D<T> 
{
    //public static implicit operator IC(D<T> m)//Error: user-defined conversions to or from an interface are not allowed
    //{
    //    return null;
    //}
}
4

1 に答える 1

3

ユーザー定義のクラスまたは構造体を暗黙的にインターフェースに変換できるようにする場合は、クラス/構造体にそのインターフェースを実装させます。

(編集)

また、IC<B>暗黙的にに変換できるようにする場合は、キーワードを指定しIC<A>IC<T>インターフェイスを共変にします。あなたが与えた仕様からの引用は、これら2つの暗黙の変換の「構成」も暗黙の変換であることを示しています。Toutinterface IC<out T> { }

ソース:

interface IC<out T> {  }

class D<T> : IC<T>  { }

(編集終了)

List<string>クラスに関しては、が共変()であるため、これIEnumerable<string>を(暗黙的に)変換可能に実装します。IEnumerable<object>IEnumerable<out T>outT

(インターフェイスとの間で変換を行うことを許可しなかった理由の1つは、誰かがクラスから継承してインターフェイスpublic static implicit operator実装した派生クラスを作成できるためです。これにより、クラス間で「自然な」変換が行われます。およびインターフェイスですが、これも適用され、タイプ間で2つの変換(1つは「自然」および1つは「ユーザー定義」)になり、混乱してあいまいになります。)public static implicit operator

于 2013-02-08T22:06:49.083 に答える