9

我可以将 int 隐式转换为 IComparable。我还可以将列表或数组转换为 IEnumerable。

但是为什么我不能将 List 隐式转换为 IEnumerable?

我使用 .net framework 4.5 和 Visual Studio 2012 Ultimate 对此进行了测试。

测试代码:

IComparable test1;
int t1 = 5;
test1 = t1; //OK

IEnumerable<int> test2;
List<int> t2 = new List<int>();
int[] t3 = new int[] { 5, 6 };
test2 = t2; //OK
test2 = t3; //OK

TabAlignment[] test;

IEnumerable<IComparable> test3;
test3 = t2; //error Cannot implicitly convert type 'System.Collections.Generic.List<int>' to 'System.Collections.Generic.IEnumerable<System.IComparable>'. An explicit conversion exists (are you missing a cast?)
4

2 回答 2

13

泛型方差基本上不适用于值类型。所以虽然你可以

您需要将每个值装箱:

IEnumerable<IComparable> test3 = t2.Cast<IComparable>();

所以虽然这是有效的,因为string它是一个引用类型:

List<string> strings = new List<string>();
IEnumerable<IComparable> comparables = strings;

...等价物不适用于List<int>,您需要随时装箱。

于 2013-02-22T16:55:26.527 回答
2

这是与泛型列表的常见混淆,但基本上如果你概括它更有意义:

考虑这个设置:

public interface IA{
}

public class A : IA{
}

var listA = new List<A>();

以下行不起作用:

List<IA> listI = ListA;

本质上这是因为,即使A : IAList<I> does not : List<A>- 它们是完全独立的类型。

您可以使用以下Cast方法轻松完成演员阵容:

listI = ListA.Cast<IA>();

所以在你的情况下你可以做

test3 = t2.Cast<IComparable>();
于 2013-02-22T16:57:31.063 回答