2010-11-09 124 views
1

方案
我有三個IEnumerable的名單 - IEnumerable<Dog>IEnumerable<Cat>IEnumerable<Horse>
我希望他們在一個單一的IEnumerable<NameColor>
我有一個public static explicit operator NameColor在每個狗,貓和馬的對象定義爲允許我將它們轉換成NameColorC#聯合運營商

所以:

IEnumerable<NameColor> list = dogs as IEnumerable<NameColor>; 
list = list.Union(cats as IEnumerable<NameColor>); 
list = list.Union(horses as IEnumerable<NameColor>); 

然而,這並不工作。我得到錯誤Value cannot be null. Parameter name: first,但我沒有看到一個名爲first的參數,即使是一個選項?!

+0

也許Union需要.First()。你確定沒有這些清單是空的嗎? – simendsjo 2010-11-09 09:47:01

+1

順便說一句 - 「Union」與「我希望他們都在......」中不一樣 - 你可能是指「Concat」。 – 2010-11-09 09:58:38

回答

1

我建議:

var list = dogs.Select(d => (NameColor)d) 
       .Union(cats.Select(c => (NameColor)c)) 
       .Union(horses.Select(h => (NameColor)h)); 
+0

我不知道'Enumerable.Cast()'是否適用於轉換。編輯:檢查源代碼,並意識到它不會像IEnumerable一樣。 – 2010-11-09 09:51:52

3

firstEnumerable.Union隱含 「這個」 參數。這是拋出一個例外,因爲as運算符的結果是null

基本問題是,有一個轉換操作符的Dog並不意味着你可以把一個IEnumerable<Dog>作爲IEnumerable<NameColor>。基本上用Select代替。

實際上有轉換的背後有兩個原因不工作:

  • as不適用反正轉換,因此,如果你這樣做:

    NameColor nameColor = dog as NameColor; 
    

    仍然會留下nameColor爲空。

  • 只是因爲有元素類型之間的轉換並不意味着轉換應用於集合類型本身。通用方差僅適用於參考類型轉換,即表示保留

+0

+1感謝您的解釋:) – Jimbo 2010-11-09 09:59:11