我有以下lambda表達式:邏輯短路和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();
在類定義中的關鍵字字段被設置爲空值:
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發生在lambda之前,整個表達式應該短路爲false。這是否與lambda或其他我沒有得到的東西有關?
編輯:
我發現的罪魁禍首,它是設置字符串數組,字符串的空代替[1]的構造函數。
你確定關鍵字爲空而不是關鍵字之一嗎? – 2015-02-11 11:18:07
你怎麼知道它是空的?由於它是短路的,另一個原因可能是該集合包含一個爲null的項,導致'kw.Contains'處的'NullReferenceException'。 – 2015-02-11 11:19:36
其中一個關鍵字肯定是'null'。將'kw.Contains(query)'改爲'kw!= null && kw.Contains(query)',你應該沒問題。在調試器中良好的使用Step In和Step Out會告訴你'n.KeyWords'確實不爲空,並且你將能夠識別集合中的所有空條目。我首先會擔心他們爲什麼會在那裏。 – SimpleVar 2015-02-11 11:20:04