Невозможно назначить Func <Interface>из Func <T> - PullRequest
2 голосов
/ 21 сентября 2011

Если у меня есть

public class MyClass
{
    public Func<IModel> InputFunc { get; set; }
}

и попробуйте сделать

public void SetInput<TInput>(Func<TInput> funcInput) where TInput:IModel
{
   ...
   var c = new MyClass();
   c.InputFunc = funcInput;
   ...
}

Я получаю ошибку компиляции

 Cannot implicitly convert type 'System.Func<TInput>' to 'System.Func<IModel>'

Почему это вызвано? Как я могу преодолеть эту проблему? (Я пробовал предложение where, но не помогает)

1 Ответ

7 голосов
/ 21 сентября 2011

Две возможности:

  1. Вы, вероятно, используете C # 3 / .NET 3.5 (или более раннюю версию).

    Общая ковариация для интерфейсов и делегатов была введена только вC # 4.

  2. Это просто потому, что вы не требовали, чтобы TInput был ссылочным типом.Попробуйте это:

    void SetInput<TInput>(Func<TInput> func) where TInput : class, IModel
    

    Это необходимо, потому что в противном случае TInput может быть типом значения , реализующим IModel (я предполагаю, что IModel - это интерфейс) и ковариацияне поддерживается для типов значений (из-за различий в представлении).

Я только что попробовал это с дополнительным ограничением, и это хорошо в C # 4.

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