Я не могу преобразовать этот экземпляр в словарь - PullRequest
2 голосов
/ 25 августа 2011

Я писал эту строку:

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 Не удалось преобразовать лямбда-выражение в тип делегата 'System.Func>', поскольку некоторые типы возвращаемых данных в блоке неявно не преобразуются в тип возврата делегата

Что я делаю не с теми людьми?

1 Ответ

3 голосов
/ 25 августа 2011

Вам нужно сделать свой IProblemFactory ковариантным для поддержки этого сценария:

public interface IProblemFactory<out T> where T : IProblem

По сути, это означает, что T может быть IP-проблемой или чем-то, что реализует ее в таких случаях, как ваш.

Вот пара статей о ковариантности и контравариантности в C #:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...