【问题标题】:Cannot convert lambda expression to type 'object' because it is not a delegate type无法将 lambda 表达式转换为类型“对象”,因为它不是委托类型
【发布时间】:2014-04-23 14:16:58
【问题描述】:

我有一个基类,它的 bool 属性如下所示:

public abstract class MyBaseClass
{
     public bool InProgress { get; protected set; }
}

我正在从它继承另一个类,并尝试将 InProgress 作为代表添加到字典中。但它给我一个错误。这就是我的派生类的样子:

public abstract class MyClass
{
     Dictionary<string, object> dict = new Dictionary<string, object>();
     dict.Add("InProgress", InProgress => base.InProgress = InProgress);

}

这是我得到的错误:

无法将 lambda 表达式转换为类型“对象”,因为它不是委托类型

我在这里做错了什么?

【问题讨论】:

  • 正如错误消息所说 - 你有一个 lambda 表达式,你正在尝试将它转换为 object。您想要将其转换为哪种委托类型,您希望编译器如何知道这一点?
  • 你为什么要在字典中添加一个 lambda?
  • @DStanley 这没什么不寻常的吧?
  • @Rawling 我并没有说这很不寻常,我只是想知道为什么,以防有更好的方法来实现真正的目标。
  • 我正在调试第三方代码并对其进行重构。这是我首先需要让代码工作的部分,因为它正在抛出错误。

标签: c# linq lambda delegates


【解决方案1】:

最好是强类型字典,但如果你先将 lambda 分配给特定的 lambda(委托),它应该可以工作(因为编译器然后知道委托格式):

Action<bool> inp = InProgress => base.InProgress = InProgress;
dict.Add("InProgress", inp);

或者直接施法,效果一样

dict.Add("InProgress", (Action<bool>)(InProgress => base.InProgress = InProgress));

当然,对象这样的字典格式是可以讨论的,因为您必须知道委托格式才能使用它。

【讨论】:

    【解决方案2】:

    我失踪时收到此错误

    using System.Data.Entity;
    

    【讨论】:

    • 这对我有用,谢谢!想知道,在一个文件中这是有效的,而不是在另一个文件中,所以认为一定是愚蠢的!
    • 你太棒了!这是给我的...这也是第一次发生,已经使用 EF 有一段时间了,但从未见过这个,我希望至少会出现 Import 的建议...
    【解决方案3】:

    虽然 @Me.Name 的解决方案本身是完全有效的,但在某些情况下还有一个额外的技巧可能会派上用场(它确实对我有用):如果您要转换多个使用这种技术的 lambdas,您可以将强制转换作为辅助方法,沿线

    object myDelegateToObject ( Action<bool> action ) {
        return action; // autocast to `object` superclass, no explicit cast needed
    }
    

    然后简单地调用它

    dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress));
    

    以后可能会节省您的时间 - 如果您决定更改签名,您只需在一个地方进行。

    【讨论】:

      【解决方案4】:

      我在编写单元测试时遇到了这个问题。我试图模拟数据库的行为以从存储库返回一个新对象,而不是实际连接到数据库。

      确保你的对象有一个可用的构造函数。您可能无法按照您想要的方式成功地实例化该对象。如果您使用 lambda 来指向构造函数,请确保可以在正常的实例化语句中以相同的方式调用构造函数。

      return x => new FakeObject();
      

      如果是这样的话

      var fake = new FakeObject();
      

      不起作用,那么 lambda 也会失败,所以要小心。

      【讨论】:

        【解决方案5】:

        如果您在 nopcommerce 中遇到此错误,您需要添加导入行 using System.Linq;

        【讨论】:

          猜你喜欢
          • 2020-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多