0

我只是不明白,因为将一个通用容器转换为另一个容器会非常有用吗?

Stack <IType> stack = new Stack<SomeType>();
4

3 回答 3

4

您是在谈论这样的转换吗?

IFoo<Child> child = ...;
IFoo<Parent> parent = child;

如果是这样,这就是所谓的协方差。这通常与它的对应逆变器配对。当前版本的 C# 中确实没有此功能。但它将在 C# 和 VB.Net 的下一版本中可用。

关于即将发布的一些文章

于 2009-04-21T03:42:42.170 回答
2

虽然@JaredPar 说的是真的,但今天有一些可用的集合的变通方法。例如,如果从一种类型到另一种类型的合法转换,您可以使用 Cast IEnumerable 扩展。

List<Foo> list = barList.Cast<Foo>().ToList();

或者您可以使用 Select 从一种类型显式转换为另一种类型。

List<double> dList = intList.Select( i => Convert.ToDouble( i ) ).ToList();

请注意,这两种方法都将生成适当类型的新集合,而不是简单地将集合分配给不同类型的变量,这将在 C#/VB 的下一版本中的某些条件下可用。

于 2009-04-21T03:49:46.723 回答
1

关于你给出的例子:

Stack <IType> stack = new Stack<SomeType>();

如果我们这样做会发生什么:

stack.Add(new SomeOtherTypeNotDerivedFromSomeType());

这是.Net中不允许协方差的基本原因,我猜是因为通用容器的底层集合不一定与声明的类型匹配。Eric Lippert 的文章非常详细(比我真正能做到的还要多)。

于 2009-04-21T03:50:22.463 回答