协方差,逆变和消除多余的类型参数

时间:2012-02-13 14:56:37

标签: c# covariance contravariance

给定以下类层次结构:

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推断出那些?

1 个答案:

答案 0 :(得分:2)

where TD : D表示D不是通用的,其中TD : D<TA, TB, TC>表示D是通用的。