当类型已知时,类型'T'不能用作泛型类型或方法错误中的类型参数

时间:2012-11-06 14:41:01

标签: c# c#-4.0 generics c#-3.0 c#-2.0

请考虑以下代码示例,其中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'不能用作类型参数'T'   通用类型或方法   '酒吧'。那里   没有从'T'到...的隐式引用转换   '混凝土'。

1 个答案:

答案 0 :(得分:4)

编译器无法知道当前对Base的约束的T实际上是Concrete,即使你之前测试它也是如此。

所以:

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

不要让它有机会这样做。