2

.Net フレームワークのバージョン 4.0 をターゲットにしています。次の簡単なコードを書きました。

public class A
{
    public A()
    {
    }
}

public class B
{
    public B()
    {
    }

    public static implicit operator A(B b)
    {
        return new A();
    }
}

次に、一般的なリストを作成しました。

 var mylist = typeof(List<>).MakeGenericType(typeof(A)).GetConstructor(Type.EmptyTypes).Invoke(new object[]{});

B次のコードの新しいインスタンスを追加したい場合は、次のように機能します。

((IList<A>)mylist).Add(new B());

ただし、以下のコードを実行すると、次の例外がスローされます。

The value "B" is not of type "A" and cannot be used in this generic collection.

パラメータ名: 値

((IList)mylist).Add(new B());
4

2 に答える 2

2

Addタイプのオブジェクトを に追加しているため、暗黙的な変換は最初にのみ発生BしますIList<A>。2 番目のケースでは、それをオブジェクトのコレクションである non-generic に追加していてIList、暗黙的な変換は行われず、オブジェクトが実際にあなたのList<A>

これでも失敗します:

var mylist = new List<A>();
((IList<A>)mylist).Add(new B());
((IList)mylist).Add(new B())

ただし、これを行うことができます。

((IList)mylist).Add((A)new B());
于 2013-01-19T19:59:52.523 に答える
1

問題は、リストを にキャストしてIList<A>を呼び出すと、コンパイラがインスタンスへAddのキャストを (暗黙的に) に追加することです。2 番目のケースでは、メソッドでのみを受け入れます。はオブジェクトなので、にキャストされません。したがって、メソッドが基になるデータ構造に内部的に追加しようとすると、例外が発生します。BAIListobjectAddBA

次のコードでテストすることもできます。

var fails = (A) (object) new B();

問題を解決する方法を尋ねるので (この場合、型を にキャストする必要があるとは思いませんが)、追加するときIListに明示的に型をキャストすることができます。例:BA

mylist.Add((A) new B());
于 2013-01-19T19:57:47.723 に答える