请考虑以下代码示例,其中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'到...的隐式引用转换 '混凝土'。
答案 0 :(得分:4)
编译器无法知道当前对Base的约束的T实际上是Concrete,即使你之前测试它也是如此。
所以:
Type type = typeof(Bar<>);
Type generic = type.MakeGenericType(typeof(T));
var x = Activator.CreateInstance(generic);
不要让它有机会这样做。