IEnumerable <T>转换

SOR*_*der 5 c#

鉴于以下内容:


class Base<T> {/*...*/}
class Der<T>: Base<T> {/*...*/}

interface Sth<T>{
  IEnumerable<Base<T>> Foo {get;}
}

// and implementation...
class Impl<T>: Sth<T> {
  public IEnumerable<Base<T>> Foo {
    get {
      return new List<Der<T>>();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我该如何编译?显然,错误不是从List <Der <T >>到List <Base <T >>的隐式转换.如果我显式地强制转换它会发生InvalidCastException.

bca*_*cat 6

从.NET Framework 3.5版开始,不支持您尝试进行的转换.由于增加了通用的协方差/逆变,它将在4.0版(Visual Studio 2010)中得到支持.虽然这仍然不会让你投List<Der>List<Base>,这让你投IEnumerator<Der>(该列表实现)来IEnumerator<Base>.

在此期间,您可以编写自己的类,它实现IEnumerable<Base>并返回一个自定义IEnumerator<Base>,简单地包装List<Der>IEnumerator<Der>.或者,如果您使用的是.NET Framework 3.5版,则可以像其他人所建议的那样使用Cast扩展方法.