为什么CLR为匿名方法创建新类?

我正在我的项目中使用匿名函数。 直到知道我在想,C#编译器只使用在同一个类中使用匿名方法的代码生成一个方法。 但是,在IL中反编译此代码之后,我看到CLR创建了一个新类。

public class Comparer { public delegate int Greater(int a, int b); public int Great(Greater greater, int a, int b) { return greater(a, b); } } static void Main(string[] args) { int valueOfA = 11, valueOfB = 23, valueOfC = 42; Comparer comparer = new Comparer(); Console.WriteLine("The greater is \t:{0}", comparer.Great(delegate(int a, int b) { int[] numbers = new int[] { a, b, valueOfC }; return Math.Max(Math.Max(a, b), valueOfC); }, valueOfA, valueOfB)); } 

这是Main方法的反编译IL代码:

 .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 65 (0x41) .maxstack 5 .locals init ([0] int32 valueOfA, [1] int32 valueOfB, [2] class Ch04.Comparer comparer, [3] class Ch04.Program/'c__DisplayClass1' 'CS$8__locals2') // Here it is ... } 

如果没有什么可以捕获它,C#编译器将在类中创建私有方法,如果你在闭包中有变量 – 将创建内部类。

第12章详细介绍- 代理和Lambda表达式

 int local = 42; ...Where(value => {return true;})... // private method ...Where(value => { return value == local;})... // class