Нет, актерский состав не задействован, поскольку List<T>
IS-A
IEnumerable<T>
. Это использует полиморфизм, который не требует кастинга.
Редактировать: Вот пример:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
foo(new List<int>());
}
static void foo(IEnumerable<int> list) { }
}
IL для Main
:
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 8
L_0000: nop
L_0001: newobj instance void [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
L_0006: call void Program::foo(class [mscorlib]System.Collections.Generic.IEnumerable`1<int32>)
L_000b: nop
L_000c: ret
}
И, как вы можете видеть, здесь нет кастинга. Экземпляр List<T>
помещается в стек, а их foo
вызывается сразу после.