c# - 协变、逆变和消除多余的类型参数

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

最佳答案

where TD : D意味着 D 不是通用的,where as where where TD : D<TA, TB, TC>暗示 D 是通用的。

关于c# - 协变、逆变和消除多余的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9262574/

相关文章:

c# - .NET C# "The remote certificate is invalid according to the validation procedure"

C# 泛型接口(interface)协方差

python - 如何用 Pandas 计算协方差矩阵

c# - 使用通用接口(interface)约束时的协变/逆变难题

scala - Scala元组的常规 'map'函数?

c# - linq select within where子句

c# - 如何将消息反序列化为强类型对象,然后为该消息动态调用运行时分配的处理程序

c#异常处理,实际例子。你会怎么做?

java - 类的集合和继承

c# - 逆变参数?