2010-11-09 118 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