2015-02-11 74 views
2

我有以下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]的構造函數。

+2

你確定關鍵字爲空而不是關鍵字之一嗎? – 2015-02-11 11:18:07

+3

你怎麼知道它是空的?由於它是短路的,另一個原因可能是該集合包含一個爲null的項,導致'kw.Contains'處的'NullReferenceException'。 – 2015-02-11 11:19:36

+2

其中一個關鍵字肯定是'null'。將'kw.Contains(query)'改爲'kw!= null && kw.Contains(query)',你應該沒問題。在調試器中良好的使用Step In和Step Out會告訴你'n.KeyWords'確實不爲空,並且你將能夠識別集合中的所有空條目。我首先會擔心他們爲什麼會在那裏。 – SimpleVar 2015-02-11 11:20:04

回答

0

正如所有人在評論中所建議的,我已經尋找了一個代碼路徑,它將我的數組的元素設置爲null而不是整個數組,並且已經找到它。它現在將整個數組設置爲null,並且代碼按預期工作。

+0

不要回答你自己的問題。 SO社區沒有任何價值。您應該刪除問題。 – Enigmativity 2015-02-11 12:09:11

+0

@Enigmativity肯定,如果你的評論得到了足夠的票選肯定刪除問題。 – 2015-02-11 12:42:37

1

調試器只是標記整行。 n.KeyWords不是零,因爲的確是&&短路。 (或者,KeyWords屬性第一次返回非null,第二次它返回null!)

看看調用堆棧以查看實際發生崩潰的方法。 lambda將位於頂部,並且使用可以使用調試器來檢查將爲空的值kw