【发布时间】:2013-11-15 07:59:48
【问题描述】:
我今天遇到了这个问题,但我不明白发生了什么:
enum Foo
{
Zero,
One,
Two
}
void Main()
{
IEnumerable<Foo> a = new Foo[]{ Foo.Zero, Foo.One, Foo.Two};
IEnumerable<Foo> b = a.ToList();
PrintGeneric(a.Cast<int>());
PrintGeneric(b.Cast<int>());
Print(a.Cast<int>());
Print(b.Cast<int>());
}
public static void PrintGeneric<T>(IEnumerable<T> values){
foreach(T value in values){
Console.WriteLine(value);
}
}
public static void Print(IEnumerable values){
foreach(object value in values){
Console.WriteLine(value);
}
}
输出:
0
1
2
0
1
2
Zero
One
Two
0
1
2
我知道 Cast() 将导致延迟执行,但看起来将其强制转换为 IEnumerable 会导致延迟执行丢失,并且仅当实际实现的集合是数组时。
为什么Print 方法中的值枚举导致enum 被转换为int 用于List<Foo> 集合,而不是Foo[]?
【问题讨论】:
-
PrintGeneric 中 Console.WriteLine(value.GetType().Name) 的输出是什么?
-
@SimSimY
Int32。当List<Foo>.Cast<int>()传入时,Print是 Int32,但是当Foo[].Cast<int>()传入时,Foo是 Int32。 -
这与延迟执行有什么关系?
-
@Servy 我错误地假设延迟执行被忽略了。
-
@Daryl 什么操作被推迟了,以后而不是更早地执行它是如何相关的?这些是您在延迟执行相关问题中应该问自己的问题。