不能赋值给Func从Func< T>

本文关键字:Func 赋值 Interface 不能 | 更新日期: 2023-09-27 18:09:09

如果

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子句,但没有帮助)

不能赋值给Func<Interface>从Func< T>

两种可能:

  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中很好。