【问题标题】:Why does this generic cast fail?为什么这个通用演员会失败?
【发布时间】:2009-07-15 19:12:42
【问题描述】:

我有以下继承:

internal abstract class TeraRow{}

internal class xRow : TeraRow {} // xRow is a child of TeraRow

public IEnumerable<TeraRow> Compare(MappedTables which, DateTime selectionStart
        , DateTime selectionEnd, string pwd)
{
    IEnumerable<xRow> result=CompareX();
    return  (IEnumerable<TeraRow>)result; //Invalid Cast Exception? 

}

无法转换类型为“System.Collections.Generic.List1[xRow]' to type 'System.Collections.Generic.IEnumerable1[TeraRow]”的对象

为什么我还需要投射它?

【问题讨论】:

  • 今年晚些时候发布的 C# 4.0 将支持这种类型的转换。解决此问题的功能称为协变泛型参数。

标签: .net generics casting ienumerable


【解决方案1】:

您需要转换它,因为IEnumerable&lt;T&gt; 在 T 上不是协变的。您可以这样做:

return result.Cast<TeraRow>();

【讨论】:

  • 向下转换泛型类型列表...这是泛型在没有明确定义复合接口的情况下分崩离析的少数地方之一。
【解决方案2】:

看到这个问题:.NET Casting Generic List

【讨论】:

    【解决方案3】:

    您正在与逆变器发生冲突。你需要 c# 4.0 才能工作。 IEnumerable 类型在 2.0 到 3.5 中不能交换为 IEnumerable。上面的msdn文章是http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

    【讨论】:

      【解决方案4】:

      如果您需要转换列表像原始引用一样执行(在索引处设置项目也会在原始集合中设置项目,您可以创建一个实现 IList 的包装器类。(除非我错过了一些东西),对于通用解决方案,由于通用约束限制,您需要两个:

      public class UpCastList<FromType, ToType> : IList<ToType>
          where FromType : ToType
      
      public class DownCastList<FromType, ToType : IList<ToType>
          where ToType : FromType
      

      另一种可能性是委托转换:

      public class CastList<FromType, ToType> : IList<ToType>
      {
          public CastList(IList<FromType> source, Func<FromType, ToType> converter) { ... }
      }
      

      编辑:如果你只需要一个 IEnumerable,那么你可以使用前面提到的 Cast 扩展方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2022-11-20
        • 2018-04-11
        • 1970-01-01
        • 2021-03-24
        • 1970-01-01
        相关资源
        最近更新 更多