5

考虑以下代码示例,其中Concrete派生自Base

class Base{}
class Concrete : Base {}

static void Foo<T>() where T : Base
{
    if (typeof(Concrete).IsAssignableFrom(typeof(T)))
    {
        var x = new Bar<T>(); // compile error on this line
    }
}

class Bar<T> where T : Concrete
{
}

在我遇到编译错误的那一行,我已经检查了泛型参数是否可以分配给该Concrete类型。所以理论上我相信应该有一种方法来创建 Bar 类的实例。

有什么办法可以消除编译错误?我想不出一种方法来提出论点。


编译错误全文:

错误 14 类型“T”不能用作泛型类型或方法“Bar”中的类型参数“T”。没有从“T”到“具体”的隐式引用转换。

4

1 回答 1

5

编译器无法知道当前对 Base 的约束的 T 实际上是 Concrete,即使您之前对其进行了测试。

所以:

Type type = typeof(Bar<>);
Type generic = type.MakeGenericType(typeof(T));
var x = Activator.CreateInstance(generic); 

不要让它有机会这样做。

于 2012-11-06T15:03:56.147 回答