如果我有

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

最佳答案

两种可能性:


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

接口和委托的通用协方差仅在C#4中引入。
只是因为您不需要TInput是引用类型。尝试这个:

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


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


我刚刚尝试了额外的约束,在C#4中就可以了。

09-28 12:38