Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过反射和隐式转换创建通用列表_C#_.net - Fatal编程技术网

C# 通过反射和隐式转换创建通用列表

C# 通过反射和隐式转换创建通用列表,c#,.net,C#,.net,我的目标是.Net framework的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

我的目标是.Net framework的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[]{});
但是,如果我运行以下代码,将引发以下异常:

The value "B" is not of type "A" and cannot be used in this generic collection.
参数名称:value

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

问题是,当您将列表强制转换为
IList
并调用
Add
时,编译器(隐式地)将强制转换添加到
B
实例中的
a
。在第二种情况下,
IList
只接受
Add
方法中的
对象
B
是一个对象,因此它不会强制转换为
A
。因此,当该方法试图在内部将其添加到基础数据结构时,会引发异常

您甚至可以通过以下代码对其进行测试:

var fails = (A) (object) new B();
既然您询问如何解决这个问题(尽管在本例中我不认为有必要将您的类型强制转换为
IList
),您可以在添加时将
B
显式强制转换为
A
。例如:

mylist.Add((A) new B());

当您将类型为
B
的对象添加到
IList
时,隐式转换仅在第一个
Add
中发生。在第二种情况下,您将其添加到非泛型的
IList
,这是一个对象集合,当对象实际添加到
列表时,不会发生隐式转换并爆炸

即使这样也不行:

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

我怎样才能解决这个问题?谢谢。但我写这段代码是为了测试。在实际代码中,我通过反射获得所有类型,但我无法编写Add((A)new B());谢谢。但我写这段代码是为了测试。在实际代码中,我通过反射获得所有类型,但我无法编写Add((A)new B())@阿夫希纳利扎德我明白。
var mylist = new List<A>();
((IList<A>)mylist).Add(new B());
((IList)mylist).Add(new B())
((IList)mylist).Add((A)new B());