协方差不适用于通用字典条目

本文关键字:字典 方差不 适用于 | 更新日期: 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>

你需要寻找另一种方法。老实说,当你有三个类型参数,并希望其中两个是协变的时候,你已经有了一个非常难以理解的设计,我担心:(