无法从Func <t> </t> </interface>分配给Func <interface>

时间:2011-09-21 13:45:08

标签: c# generics lambda

如果我有

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 个答案:

答案 0 :(得分:7)

两种可能性:

  1. 您可能正在使用C#3 / .NET 3.5(或更早版本)。

    接口和代理的通用协方差仅在C#4中引入。

  2. 这只是因为您没有要求TInput是引用类型。试试这个:

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

    这是必需的,因为否则TInput可能是值类型实现IModel(我假设IModel是一个接口)并且协方差不是支持值类型(由于表示差异)。

  3. 我刚用额外的约束尝试了它,它在C#4中很好。