逻辑短路和lambdas

时间:2015-02-11 11:16:32

标签: c# lambda short-circuiting

我有以下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。

2 个答案:

答案 0 :(得分:1)

调试器只标记整行。确实n.KeyWords短路,&&不是空的。 (或者,KeyWords属性第一次返回非null,第二次返回null!)

查看调用堆栈,了解崩溃实际发生的方法。 lambda将位于顶部,use可以使用调试器来检查kw的值为null。

答案 1 :(得分:0)

正如评论中的每个人所建议的那样,我已经找到了一个代码路径,它将我的数组元素设置为null而不是整个数组并找到它。它现在将整个数组设置为null,代码按预期工作。