【问题标题】:Casting ReadOnlyCollection<derivedType> to ReadOnlyCollection<baseType>将 ReadOnlyCollection<derivedType> 转换为 ReadOnlyCollection<baseType>
【发布时间】:2011-06-24 08:12:34
【问题描述】:

我想知道是否有人能指出我正确的方向......

如何在不迭代或“更新”副本的情况下从 ReadOnlyCollection&lt;myDerivedType&gt; 转换为 ReadOnlyCollection&lt;myBaseType&gt;

我正在使用 .NET Framework 4.0

【问题讨论】:

    标签: c# .net generics collections


    【解决方案1】:

    您可以在 C# 4 中将ROC&lt;Derived&gt; 隐式转换为IEnumerable&lt;Base&gt;,但不能转换为ROC&lt;Base&gt;

    这很不幸;能够对不可变类型进行协变转换真是太好了。

    【讨论】:

      【解决方案2】:

      我不相信你可以,因为通用参数 T 没有定义为 out(正如已经指出的那样,.net 不支持类中的协变和逆变)。

      ReadOnlyCollection<T>

      您必须使用 LINQ,例如 readOnlyColl.Cast&lt;myBaseType&gt;();,或循环。在内部,LINQ 会使用循环/迭代,制作一个新副本。

      【讨论】:

      • 或更一般地说,.Net 不支持类中的协变/逆变
      • 我认为在 .NET 4 中,这是支持的?
      • @thebowler yse 代表和接口
      【解决方案3】:

      使用 Linq

      yourCollection.Cast<myBaseType>();
      

      【讨论】:

        【解决方案4】:

        我认为 C# 中不允许泛型类型使用协变和逆变。 泛型不支持这一点——它们是不变的

        我认为只有 C#4 中的泛型委托对协变和逆变的支持有限。

        【讨论】:

        • 在 C# 4 中,当类型参数是 reference types 和法律差异在类型参数的声明中说明。
        【解决方案5】:

        您不能将ReadOnlyCollection&lt;myDerivedType&gt; 投射到ReadOnlyCollection&lt;myBaseType&gt;

        【讨论】:

          【解决方案6】:

          您不能这样做,因此您最好传递IEnumerable&lt;T&gt;ICollection&lt;T&gt; 之类的接口,而不是ReadOnlyCollection&lt;T&gt; 之类的具体类。

          然后你可以按照其他人的建议:

          collection.Cast<myBaseType>();
          

          【讨论】:

          • 你给了我一个不同的方法,在这里。我改用 IEnumerable,发现生活更美好……
          猜你喜欢
          • 1970-01-01
          • 2018-08-31
          • 2016-06-14
          • 2011-12-29
          • 2012-12-15
          • 1970-01-01
          • 2017-12-23
          • 2016-04-16
          • 2011-07-28
          相关资源
          最近更新 更多