无法从Func <T>分配给Func <Interface>

mht*_*ttk 2 c# generics lambda

如果我有

public class MyClass
{
    public Func<IModel> InputFunc { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并尝试做

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

我收到编译错误

 Cannot implicitly convert type 'System.Func<TInput>' to 'System.Func<IModel>'
Run Code Online (Sandbox Code Playgroud)

这是为什么造成的?我怎样才能克服这个问题?(我尝试了where子句但没有帮助)

Jon*_*eet 7

两种可能性:

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

    接口和委托的通用协方差仅在C#4中引入.

  2. 这只是因为你没有要求它TInput是一个参考类型.试试这个:

    void SetInput<TInput>(Func<TInput> func) where TInput : class, IModel
    
    Run Code Online (Sandbox Code Playgroud)

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

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