为什么不允许使用不同类型参数进行转换?

时间:2009-04-21 03:37:13

标签: c# .net generics covariance contravariance

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

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

3 个答案:

答案 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的文章详细介绍了(比我真的更多)。