方案
我有三个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
的参数,即使是一个选项?!
答案 0 :(得分:3)
first
是Enumerable.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));