이는 폐쇄가 없기 때문일 가능성이 높습니다. 예를 들면 다음과 같습니다.
int age = 25;
Action<string> withClosure = s => Console.WriteLine("My name is {0} and I am {1} years old", s, age);
Action<string> withoutClosure = s => Console.WriteLine("My name is {0}", s);
Console.WriteLine(withClosure.Method.IsStatic);
Console.WriteLine(withoutClosure.Method.IsStatic);
이 출력됩니다 false
에 대한 withClosure
및 true
대한 withoutClosure
.
람다 식을 사용할 때 컴파일러는 메서드를 포함하는 작은 클래스를 생성합니다.이 클래스는 다음과 같이 컴파일됩니다 (실제 구현은 약간 다를 수 있음).
private class <Main>b__0
{
public int age;
public void withClosure(string s)
{
Console.WriteLine("My name is {0} and I am {1} years old", s, age)
}
}
private static class <Main>b__1
{
public static void withoutClosure(string s)
{
Console.WriteLine("My name is {0}", s)
}
}
public static void Main()
{
var b__0 = new <Main>b__0();
b__0.age = 25;
Action<string> withClosure = b__0.withClosure;
Action<string> withoutClosure = <Main>b__1.withoutClosure;
Console.WriteLine(withClosure.Method.IsStatic);
Console.WriteLine(withoutClosure.Method.IsStatic);
}
결과 Action<string>
인스턴스가 실제로 이러한 생성 된 클래스의 메서드를 가리키는 것을 볼 수 있습니다 .
static
메서드에 대한 완벽한 후보입니다 .