协方差不适用于通用字典条目
本文关键字:字典 方差不 适用于 | 更新日期: 2023-09-27 18:01:46
给定下面的类:
public class ConcreteEmployeeRoleCreator<T, TConcrete, TSpec>
where TConcrete : class, T, new()
where T : EmployeeRole
where TSpec : EmployeeRoleSpecification
{
public ConcreteEmployeeRoleCreator(TSpec spec) { Specification = spec; }
public TSpec Specification { get; private set; }
public T Create() { return new TConcrete(); }
}
我想有一本"创造者"的字典,但是我还没能想出怎么做。如果我尝试使用最小公分母类型定义字典,编译器将不允许添加实例
[Test]
public void Creator_CanCreateFromSpec() {
var creators = new Dictionary<string, ConcreteEmployeeRoleCreator<EmployeeRole, EmployeeRole, EmployeeRoleSpecification>>();
var spec = new SalesmanRoleSpecification();
var creator = new ConcreteEmployeeRoleCreator<EmployeeRole, Salesman, SalesmanRoleSpecification>(spec);
creators.Add("salesman", creator); <==== ** compile error **
}
Salesman 是一个EmployeeRole,而SalesmanRoleSpecification 是一个EmployeeRoleSpecification(否则我将无法在没有编译器错误的情况下定义上面的创建者)。
所以我猜这是我声明字典的方式?我做错了什么?
欢呼,
Berryl
泛型协方差必须在协变类型声明时指定,并且只能为接口和委托指定。
那么,假设你在使用一个类,一个
ConcreteEmployeeRoleCreator<EmployeeRole, Salesman, SalesmanRoleSpecification>
永远不会是
ConcreteEmployeeRoleCreator<EmployeeRole, EmployeeRole, EmployeeRoleSpecification>
你需要寻找另一种方法。老实说,当你有三个类型参数,并希望其中两个是协变的时候,你已经有了一个非常难以理解的设计,我担心:(