C# 协方差、逆方差和消除多余类型参数

C# 协方差、逆方差和消除多余类型参数,c#,covariance,contravariance,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> { } 但是编

给定以下类层次结构:

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, 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>();
}
void创建(字符串描述)
TA:A在哪里
结核病:B
其中TC:C
其中TD:D
{
var instance=Activator.CreateInstance();
}
这就意味着我们不能写作

Create<H>("foo");
Create<H, E, F, G>("foo");
Create(“foo”);
我得写信

Create<H>("foo");
Create<H, E, F, G>("foo");
Create(“foo”);

我的问题是:既然我将
H
指定为具体实例,为什么编译器需要在方法签名上为基类
D
添加额外的类型参数?为什么它不能简单地从
H
中推断出那些呢?

其中TD:D
意味着D不是泛型的,而
TD:D
意味着D是泛型的。

你会期望能够说
其中TL:List
的意思是“
TL
是一些封闭的
列表,但我不在乎哪个”?