Điều này rất có thể là do không có đóng cửa, ví dụ:
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);
Điều này sẽ xuất ra false
cho withClosure
và true
cho withoutClosure
.
Khi bạn sử dụng biểu thức lambda, trình biên dịch sẽ tạo ra một lớp nhỏ để chứa phương thức của bạn, điều này sẽ biên dịch thành một thứ gì đó giống như sau (cách triển khai thực tế có thể sẽ thay đổi một chút):
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);
}
Bạn có thể thấy các Action<string>
trường hợp kết quả thực sự trỏ đến các phương thức trên các lớp được tạo này.
static
các phương pháp.