给定以下类层次结构:
abstract class A { }
abstract class B { }
abstract class C { }
abstract class D<TA, TB, TC>
where TA : A
where TB : B
where TC : C { }
class E : A { }
class F : B { }
class G : C { }
class H : D<E, F, G> { }
我想创建一个简单的泛型方法来实例化 D
类型的对象:
void Create<TD>(string description)
where TD : D
{
var instance = Activator.CreateInstance<TD>();
}
但编译器强制指定 D
的类型参数,因此我必须编写以下内容:
void Create<TD, TA, TB, TC>(string description)
where TA : A
where TB : B
where TC : C
where TD : D<TA, TB, TC>
{
var instance = Activator.CreateInstance<D>();
}
这意味着不能写
Create<H>("foo");
我要写
Create<H, E, F, G>("foo");
我的问题是:因为我将 H
指定为具体实例,为什么编译器需要在方法签名上为基类 D
添加额外的类型参数?为什么它不能简单地从 H
中推断出那些?
where TD : D
暗示 D 不是通用的,where as where where TD : D<TA, TB, TC>
暗示 D 是通用的。
我是一名优秀的程序员,十分优秀!