Afin de vérifier que l'utilisation des méthodes d'extension n'occassionne pas de changement sous le capot, Il suffit de comparer le résultat des désassemblages des différentes assemblies, celui correspondant au chapitre « Un mini-Linq en C# 2.0 » et celui de ce chapitre. Pour cela, vous pouvez utiliser l'utilitaire « ILDASM » ou « Reflector ». Si on extrait l'IL correspondant à la requête vue quelques lignes plus haut, vous constaterez qu'il est identique dans les deux cas :
L_0190: ldsfld class [System.Core]System.Func`2<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>
ConsoleApplication3.Program::<>9__CachedAnonymousMethodDelegate13
L_0195: brtrue.s L_01aa
L_0197: ldnull
L_0198: ldftn class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>
ConsoleApplication3.Program::<Main>b__b(class ConsoleApplication3.Program/EleveENT)
L_019e: newobj instance void [System.Core]System.Func`2<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>::.ctor(object, native int)
L_01a3: stsfld class [System.Core]System.Func`2<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>
ConsoleApplication3.Program::<>9__CachedAnonymousMethodDelegate13
L_01a8: br.s L_01aa
L_01aa: ldsfld class [System.Core]System.Func`2<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>
ConsoleApplication3.Program::<>9__CachedAnonymousMethodDelegate13
L_01af: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!1>
ConsoleApplication3.ComplementEnumerable::Select<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>(
class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>,
class [System.Core]System.Func`2<!!0, !!1>)
L_01b4: stloc.3
L_01b5: ldloc.0
L_01b6: ldsfld class [System.Core]System.Func`2<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>
ConsoleApplication3.Program::<>9__CachedAnonymousMethodDelegate14
L_01bb: brtrue.s L_01d0
L_01bd: ldnull
L_01be: ldftn class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>
ConsoleApplication3.Program::<Main>b__e(class ConsoleApplication3.Program/EleveENT)
L_01c4: newobj instance void [System.Core]System.Func`2<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>::.ctor(object, native int)
L_01c9: stsfld class [System.Core]System.Func`2<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>
ConsoleApplication3.Program::<>9__CachedAnonymousMethodDelegate14
L_01ce: br.s L_01d0
L_01d0: ldsfld class [System.Core]System.Func`2<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>
ConsoleApplication3.Program::<>9__CachedAnonymousMethodDelegate14
L_01d5: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!1>
ConsoleApplication3.ComplementEnumerable::Select<class ConsoleApplication3.Program/EleveENT,
class [mscorlib]System.Collections.Generic.IEnumerable`1<float32>>(
class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>,
class [System.Core]System.Func`2<!!0, !!1>)
L_01da: stloc.s h
Seuls les noms des méthodes anonymes changent. Outre la requête, il convient de s'intéresser aussi à la classe statique « ComplementEnumerable », que ce soit à partir de la compilation C# 2.0 ou de C# 3.0 qui intègre les méthodes d'extension. Vous pourrez constater que l'IL est complètement identique si on ne prend pas en compte les attributs. En effet, le désassemblage montre clairement que les méthodes d'extension sont « marquées » par des attributs.
Une des conséquences est, que si vous observez le code C# via Reflector, l'utilitaire aura fait déjà une reconnaissance de l'attribut « ExtensionAttribute » et aura placé « this » devant le premier paramètre de chaque méthode statique de la classe « ComplementEnumerable » pour son interprétation du code C#.