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子句但没有帮助)
两种可能性:
您可能正在使用C#3/.NET 3.5(或更早版本).
接口和委托的通用协方差仅在C#4中引入.
这只是因为你没有要求它TInput是一个参考类型.试试这个:
void SetInput<TInput>(Func<TInput> func) where TInput : class, IModel
Run Code Online (Sandbox Code Playgroud)
这是必需的,因为否则TInput可能是实现的值类型IModel(我假设IModel是一个接口),并且值类型不支持协方差(由于表示差异).
我刚刚尝试了额外的约束,它在C#4中很好用.