我有以下lambda表达式:
response = allDescendants
.Where(n =>
n.Caption.Contains(query) ||
n.Identifier.ToString().Contains(query) ||
n.Type.ToString().Contains(query) ||
n.Path.Contains(query) ||
n.Description.Contains(query) ||
(n.KeyWords != null && n.KeyWords.Any(kw => kw.Contains(query))) ||
n.SubType.Contains(query) ||
n.GroupingBy.Contains(query)
).ToList();
在类定义中,keyWord字段设置为null:
private string[] keyWords = null;
public string[] KeyWords
{
get { return keyWords; }
set { keyWords = value; }
}
行(n.KeyWords != null && n.KeyWords.Any(kw => kw.Contains(query)))
抛出一个NullReferenceException,因为KeyWord字段为null,但我的印象是,由于检查null发生在lambda之前,整个表达式应该短路为false。这是与lambdas或其他我没有得到的具体事情吗?
编辑:
我找到了罪魁祸首,它是一个构造函数,它将字符串数组设置为string [1]而不是null。
答案 0 :(得分:1)
调试器只标记整行。确实n.KeyWords
短路,&&
不是空的。 (或者,KeyWords
属性第一次返回非null,第二次返回null!)
查看调用堆栈,了解崩溃实际发生的方法。 lambda将位于顶部,use可以使用调试器来检查kw
的值为null。
答案 1 :(得分:0)
正如评论中的每个人所建议的那样,我已经找到了一个代码路径,它将我的数组元素设置为null而不是整个数组并找到它。它现在将整个数组设置为null,代码按预期工作。