【问题标题】:c# Union Operatorc# 联合运算符
【发布时间】:2011-05-07 03:29:55
【问题描述】:

场景
我有三个 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 的参数甚至是一个选项?!

【问题讨论】:

  • 也许联盟需要 .First()。您确定这些列表都不是空的吗?
  • 顺便说一句 - 请注意 Union 与“我希望他们都在...”并不完全相同 - 您可能是指 Concat

标签: c# casting operators union


【解决方案1】:

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

基本上,问题在于拥有Dog 的转换运算符并不意味着您可以将IEnumerable&lt;Dog&gt; 视为IEnumerable&lt;NameColor&gt;。基本上改用Select

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

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

    NameColor nameColor = dog as NameColor;
    

    这仍然会使nameColor 为空。

  • 仅仅因为 element 类型之间存在转换并不意味着转换应用于 collection 类型本身。泛型方差仅适用于引用类型转换,即保留表示

【讨论】:

    【解决方案2】:

    我建议:

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

    【讨论】:

    • 我想知道Enumerable.Cast() 是否适用于转换。编辑:检查了源代码并意识到它不会,因为它只是对IEnumerable 进行as 演员。
    猜你喜欢
    • 2023-02-24
    • 2013-03-17
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多