我在写这行:

var factory = new Dictionary<Types, Func<IProblemFactory<IProblem>>>();
        factory.Add(Types.Arithmetic, ()=> new ArithmeticProblemFactory()));

public interface IProblem { ... }
public interface IProblemFactory<T> where T : IProblem
{
    // Some stuff
}

public class Arithmetic<TResult> : IProblem
{ }
public class ArithmeticProblemFactory : IProblemFactory<Arithmetic<decimal>>
{ }


它告诉我这个错误:

错误1无法将类型'Exam.ArithmeticProblemFactory'隐式转换为'Exam.IProblemFactory'。存在显式转换(您是否缺少演员表?)

错误2无法将lambda表达式转换为委托类型'System.Func>',因为该块中的某些返回类型不能隐式转换为委托返回类型

我在做错人吗?

最佳答案

您需要使您的IProblemFactory协变量以支持这种情况:

public interface IProblemFactory<out T> where T : IProblem


基本上,这意味着T可以是IProblem,也可以是在您这样的情况下实现它的任何东西。

以下是有关C#中协方差和协方差的几篇文章:


Covariance and Contravariance FAQ
Covariance and Contravariance in Generics

10-05 22:39