逻辑短路和 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,并且代码按预期工作。