逻辑短路和 lambda
logical short-circuit and lambdas
我有以下 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();
在 class 定义中,关键字字段设置为空:
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。这是特定于 lambda 的东西还是我没有得到的东西?
编辑:
我找到了罪魁祸首,它是一个将字符串数组设置为 string[1] 而不是 null 的构造函数。
调试器只是标记整行。 n.KeyWords
不为空,因为确实 &&
短路了。 (或者,第一次调用 KeyWords
属性 returns 非空,第二次调用它时为空!)
查看调用堆栈以了解崩溃实际发生在哪个方法中。 lambda 将在顶部,并且可以使用调试器检查 kw
的值为 null。
正如评论中的每个人所建议的那样,我一直在寻找将数组元素设置为 null 而不是整个数组的代码路径,并找到了它。它现在将整个数组设置为 null,并且代码按预期工作。
我有以下 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();
在 class 定义中,关键字字段设置为空:
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。这是特定于 lambda 的东西还是我没有得到的东西?
编辑:
我找到了罪魁祸首,它是一个将字符串数组设置为 string[1] 而不是 null 的构造函数。
调试器只是标记整行。 n.KeyWords
不为空,因为确实 &&
短路了。 (或者,第一次调用 KeyWords
属性 returns 非空,第二次调用它时为空!)
查看调用堆栈以了解崩溃实际发生在哪个方法中。 lambda 将在顶部,并且可以使用调试器检查 kw
的值为 null。
正如评论中的每个人所建议的那样,我一直在寻找将数组元素设置为 null 而不是整个数组的代码路径,并找到了它。它现在将整个数组设置为 null,并且代码按预期工作。