繁体   English   中英

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

[英]Cannot convert lambda expression to type 'object' because it is not a delegate type

我有一个具有 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 分配给特定的 lambda(委托),它应该可以工作(因为编译器然后知道委托格式):

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

或者直接施放,效果一样

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

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

我失踪时收到此错误

using System.Data.Entity;

尽管@Me.Name的解决方案本身完全有效,但在某些情况下还有一个额外的技巧可能会派上用场(对我来说确实如此):如果您使用此技术转换多个 lambda,则可以考虑演员表作为辅助方法,沿着

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

然后简单地调用它

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

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

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

确保您的对象具有可用的构造函数。 您可能无法按照您想要的方式成功实例化该对象。 确保使用 lambda 指向构造函数时,可以在普通实例化语句中以相同方式调用构造函数。

IE

return x => new FakeObject();

在这种情况下说

var fake = new FakeObject();

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM