c#联盟运营商

时间:2010-11-09 09:44:53

标签: c# casting operators union

方案
我有三个IEnumerable列表 - IEnumerable<Dog>IEnumerable<Cat>IEnumerable<Horse> 我希望他们只需一个IEnumerable<NameColor> 我在每个Dog,Cat和Horse对象上都定义了public static explicit operator NameColor,允许我将它们转换为NameColor

所以:

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的参数,即使是一个选项?!

2 个答案:

答案 0 :(得分:3)

firstEnumerable.Union的隐含“this”参数。它抛出异常,因为as运算符的结果是null

基本上问题是拥有Dog 的转换运算符意味着您可以将IEnumerable<Dog>视为IEnumerable<NameColor>。基本上使用Select代替。

您的转换无效后实际上有两个原因:

  • as无论如何都不会应用转化,所以如果您这样做:

    NameColor nameColor = dog as NameColor;
    

    仍会将nameColor留空。

  • 仅因为元素类型之间的转换并不意味着转换应用于集合类型本身。通用方差仅适用于参考类型转换,表示保留

答案 1 :(得分:1)

我建议:

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