Я столкнулся с этой проблемой сегодня, и я не понимаю, что происходит:
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[]
?