我只是不明白,因为将一个通用容器转换为另一个容器会非常有用吗?
Stack <IType> stack = new Stack<SomeType>();
我只是不明白,因为将一个通用容器转换为另一个容器会非常有用吗?
Stack <IType> stack = new Stack<SomeType>();
您是在谈论这样的转换吗?
IFoo<Child> child = ...;
IFoo<Parent> parent = child;
如果是这样,这就是所谓的协方差。这通常与它的对应逆变器配对。当前版本的 C# 中确实没有此功能。但它将在 C# 和 VB.Net 的下一版本中可用。
关于即将发布的一些文章
虽然@JaredPar 说的是真的,但今天有一些可用的集合的变通方法。例如,如果从一种类型到另一种类型的合法转换,您可以使用 Cast IEnumerable 扩展。
List<Foo> list = barList.Cast<Foo>().ToList();
或者您可以使用 Select 从一种类型显式转换为另一种类型。
List<double> dList = intList.Select( i => Convert.ToDouble( i ) ).ToList();
请注意,这两种方法都将生成适当类型的新集合,而不是简单地将集合分配给不同类型的变量,这将在 C#/VB 的下一版本中的某些条件下可用。
关于你给出的例子:
Stack <IType> stack = new Stack<SomeType>();
如果我们这样做会发生什么:
stack.Add(new SomeOtherTypeNotDerivedFromSomeType());
这是.Net中不允许协方差的基本原因,我猜是因为通用容器的底层集合不一定与声明的类型匹配。Eric Lippert 的文章非常详细(比我真正能做到的还要多)。