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