C# 协方差不适用于通用词典条目

C# 协方差不适用于通用词典条目,c#,generics,covariance,C#,Generics,Covariance,鉴于以下类别: public class ConcreteEmployeeRoleCreator<T, TConcrete, TSpec> where TConcrete : class, T, new() where T : EmployeeRole where TSpec : EmployeeRoleSpecification { public ConcreteEmployeeRoleCreator(TSpec spec) { Specifica

鉴于以下类别:

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(); }

}
公共类ConcreteEmployeerElectrator
其中T混凝土:class,T,new()
式中T:EmployeeRole
式中TSpec:雇主职业规范
{
公共混凝土雇主分子发生器(TSpec规范){Specification=spec;}
公共TSpec规范{get;private set;}
public T Create(){返回新的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 **
}
[测试]
public void创建者\u CanCreateFromSpec(){
var creators=newdictionary();
var spec=新的SalesmanRoleSpecification();
var creator=新的混凝土雇主分子创造者(规范);

creators.Add(“saller”,creator);必须在协变类型的声明中指定通用协变,并且只能为接口和委托指定它

因此,假设您使用的是一个类

ConcreteEmployeeRoleCreator<EmployeeRole, Salesman, SalesmanRoleSpecification>
concreteEmployeerElectrator
永远不会是一个

ConcreteEmployeeRoleCreator<EmployeeRole, EmployeeRole, EmployeeRoleSpecification>
concreteEmployeerElectrator

您需要寻找另一种方法。老实说,当您得到三个类型参数并希望其中两个是协变的时,恐怕您已经有了一个很难理解的设计开始:(

您使用的是C#3.5还是4.0?他们在C#4.0中做了一些改进,但编译器实际上说的是什么?差异只适用于(但不限于)界面,而不是具体的实现。我真的很欣慰你这么说!我正在尝试通过1997年Baumer,Reichle的“角色对象模式”的设计,他们使用了他们的另一种模式“Product Trader”它有一个C++模板,它看起来相当于我所提出的泛型类。我希望如果今天的文章被写出来,它只会使用我现在正在做的CreateInstance(Type)。