【问题标题】:I can't figure out where this NullReferenceException is coming from我不知道这个 NullReferenceException 来自哪里
【发布时间】:2015-07-14 04:58:56
【问题描述】:

编辑经过进一步思考,我决定在下面修改我的答案,以减少对问题的误解的可能性。

我在这个IEnumarable LINQ 查询上得到了一个NullReferenceException

designations.ForEach(desg => 
desg.ModifiedBy.UserName = userNames.SingleOrDefault(name => 
  desg.ModifiedBy != null && name.Id == desg.ModifiedBy.Id) != null ? 
  userNames.SingleOrDefault(name => name.Id == desg.ModifiedBy.Id).UserName : 
  "Not Available");

目前我最好的猜测是它来自上面代码第三行的以下语句:

desg.ModifiedBy != null && name.Id == desg.ModifiedBy.Id

并且运行时在desg.ModifiedBy.Id 上抛出NullReferenceException。但是,我“知道” c# 真实性评估短路(参见,例如,|| Operator)。在这里,如果desg.ModifiedBy == null 那么我们永远不应该评估name.Id == desg.ModifiedBy.Id。尽管如此,这似乎正在发生。这可能吗?

【问题讨论】:

  • @haim770 这是对该行为的唯一可能解释,并且由于问题对于它是否是对象查询的 linq 是模棱两可的,并且只有一种模糊性的解决方案有答案,它是相当安全的假设。
  • 我们不能一直猜测可能出了什么问题。发布short but complete code demonstrating the problem。在几分钟内得到答案。否则会因为无法复制而被关闭。
  • @Seebiscuit,我已经删除了重复的标志。但如果是针对对象的 LINQ,我不认为 the 问题是可重现的
  • @stefankmitph 因为问题没有提供代码来重现指定的问题并添加了不必要的讨论。顺便说一句,用调试器找到他获得 NRE 的原因相当简单。

标签: c# .net linq boolean


【解决方案1】:

我认为你在赋值时得到了 null

desg.ModifiedBy.UserName = userNames.SingleOrDefault(name =>

【讨论】:

  • OP 声明异常是从一个单独的表达式抛出的。
  • @SriramSakthivel 我更改了我的评论以响应更改后的答案。这不是引发异常的地方。
  • @Servy 他怎么知道哪个表达式引发了异常?两者都在同一行。
  • @SriramSakthivel IDE 将突出显示不同的部分(在涉及 lambda 的情况下,它将突出显示部分行),堆栈跟踪将完全不同。
  • Vidas,这是一个非常复杂的帖子(有它自己的 SOmeta 对应物,等等)。我不仅感谢您正确回答了我的问题,而且您只是简单地回答了它。虽然我的问题有很多问题,但我感谢 @Servy 等人提高了我的意识,最终,像你这样勇敢的社区成员,他们不说话,而是行动,这让我很特别。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
相关资源
最近更新 更多