![](/img/trans.png)
[英]cannot convert lambda expression to type object because it is not a delegate type
[英]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.