【发布时间】:2010-08-02 12:20:32
【问题描述】:
我如何从(演员?,转换?):
IEnumerable<Square>
到
IEnumerable<Shape>
【问题讨论】:
-
这是哪个版本的 .NET?
标签: .net collections ienumerable
我如何从(演员?,转换?):
IEnumerable<Square>
到
IEnumerable<Shape>
【问题讨论】:
标签: .net collections ienumerable
如果您使用的是低于 .NET 4.0 的版本,那么您将不得不使用 IEnumerable.Cast:
IEnumerable<Square> squares = new List<Square>();
// Fill the collection
IEnumerable<Shape> shapes = squares.Cast<Shape>();
.NET 4.0 引入了新的协变和逆变功能,允许您直接进行转换:
IEnumerable<Square> squares = new List<Square>();
IEnumerable<Shape> shapes = (IEnumerable<Shape>)squares;
【讨论】:
var shapes = squares.Cast<Shape>();
【讨论】:
如果您使用的是 .NET 4.0,则不必这样做。
来自Covariance and Contravariance in Generics(已添加重点):
多态性使您能够将 Derived 的实例分配给 Base 类型的变量。同样,由于 IEnumerable(T) 接口的类型参数是协变的,您可以将
IEnumerable<Derived>的实例分配给IEnumerable<Base>类型的变量...
既然你问这个问题,我假设你还没有使用 .NET 4.0。但如果可以的话,这可能是升级的理由。
【讨论】: