【问题标题】:Cannot assign to Func<Interface> from Func<T>无法从 Func<T> 分配给 Func<Interface>
【发布时间】:2011-09-21 13:45:08
【问题描述】:

如果我有

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

【问题讨论】:

  • 这在 .net 4 上的 C#4 中应该没问题。您使用的是哪个版本?
  • 嗯它在 C# 4 中由于某种原因无法编译。
  • 我在 Visual Studio 2010 Professional 上使用 C#4。
  • @CodeInChaos:我也是这么想的,但是需要对泛型类型参数约束进行调整。

标签: c# generics lambda


【解决方案1】:

两种可能:

  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 中没问题。

【讨论】:

  • 太棒了!是的,IModel 是一个界面,并且调整效果很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
相关资源
最近更新 更多