【问题标题】:Type Cast error from lambda to delegate从 lambda 类型转换错误到委托
【发布时间】:2014-01-30 13:11:48
【问题描述】:

我一直在关注这个Example 来实现 LazyLoading,用一些值初始化lazyObject 我在 Lambda 表达式的帮助下调用函数。 但是,我收到转换错误,它说它不是委托。下面是代码:

private Lazy<t_user_audit> lazyList = null;
lazyList = new Lazy<t_user_audit>(() => new t_user_audit { client.GetAudit(10) });

我已经在谷歌上搜索了这个错误,但它似乎没有帮助,而且我在我的生活中第一次看到这个错误,所以我可能需要正确语法的编码帮助。那么现在有人可以帮助我吗?

public t_user_audit GetAudit(int id)
{
    return _work.GetGenericRepositoryFor<t_user_audit>().SingleOrDefault(p => p.CustomerId == id);
}

现在,如您所见,我正在使用分层架构,因此我无法发布整个代码以及我正在使用的另一件事 Entity Framework.

之后,使用上面的行,我得到两个错误:

错误 17 无法将 lambda 表达式转换为类型“bool”,因为它不是委托类型

第二个是:

错误 18 无法使用集合初始化程序初始化类型“BBTI.Entities.t_user_audit”,因为它没有实现“System.Collections.IEnumerable”

【问题讨论】:

  • GetAudit 返回什么?
  • 您是否向我们提供了我们需要的所有信息? client.GetAudit(Int) 返回什么?
  • 它会返回一个带有单条记录的对象...
  • @HarshSharma,请发布方法签名
  • 它返回一个对象或一个列表?

标签: c# lambda delegates


【解决方案1】:

已编辑问题的新答案

问题是您的 lambda 表达式无效 - 您正在尝试使用集合初始值设定项语法,但您的类型不是集合。所以不要这样:

() => new t_user_audit { client.GetAudit(10) }

你想要:

() => new List<t_user_audit> { client.GetAudit(10) }

原答案

来自cmets:

“它将返回一个具有单个记录的对象”

如果你的意思是 GetAudit 被声明为返回一个 t_User,像这样:

public t_User GetAudit(int something)

那就是问题所在。要创建Lazy&lt;List&lt;Foo&gt;&gt;,您需要一个代表返回List&lt;Foo&gt;,而不是单个Foo。所以这应该有效:

lazyList = new Lazy<List<t_User>>(() => new List<t_User> { client.GetAudit(10) });

或者,如果您只想获取一次使用,您也可以将其设为 Lazy&lt;t_User&gt;

另一种可能性(很难判断,因为您没有在问题中提供足够的信息)是 GetAudit 返回类似 IEnumerable&lt;t_User&gt; 而不是 List&lt;t_User&gt; 的内容。在这种情况下,您只需要根据返回值创建一个列表:

lazyList = new Lazy<List<t_User>>(() => client.GetAudit(10).ToList());

(我也强烈鼓励您开始遵循 .NET 命名约定,并放弃 t_ 前缀。)

【讨论】:

  • “一个有单条记录的对象”可能就像一个有一个条目的列表一样简单
  • @Andrei:也许。但我怀疑不是。我们会看到:)
  • 我怀疑不是,(因为他有错误),但这也是我解释他的评论的方式。该示例还返回一个 List
  • @iandotkelly:已经编辑了我的答案以更加谨慎:)
  • @HarshSharma:查看我的编辑。而且您仍然应该修正您的类型名称以遵循 .NET 约定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多