Lý do là như sau:
Cách bạn khai báo ủy quyền nó trỏ trực tiếp đến ToString
phương thức của thể hiện static int. Nó được chụp tại thời điểm tạo ra.
Như flipndeberg đã chỉ ra trong các bình luận bên dưới, mỗi đại biểu có một mục tiêu và một phương pháp để thực hiện trên mục tiêu.
Trong trường hợp này, phương thức được thực thi rõ ràng là ToString
phương thức. Phần thú vị là thể hiện mà phương thức được thực thi: Đó là thể hiện của I
tại thời điểm tạo, có nghĩa là người ủy quyền không sử dụng I
để lấy thể hiện đó sử dụng nhưng nó lưu trữ tham chiếu đến chính thể hiện đó.
Sau đó, bạn thay đổi I
thành một giá trị khác, về cơ bản sẽ gán cho nó một phiên bản mới. Điều này không làm thay đổi một cách kỳ diệu phiên bản được chụp trong ủy quyền của bạn, tại sao phải làm vậy?
Để có được kết quả như mong đợi, bạn cần phải thay đổi ủy quyền thành:
static Func<string> del = new Func<string>(() => I.ToString());
Như vậy, ủy nhiệm trỏ đến một phương thức ẩn danh thực thi ToString
trên phương thức hiện I
tại tại thời điểm thực thi ủy quyền.
Trong trường hợp này, phương thức được thực thi là một phương thức ẩn danh được tạo trong lớp mà trong đó ủy nhiệm được khai báo. Ví dụ là null vì nó là một phương thức tĩnh.
Hãy xem mã mà trình biên dịch tạo ra cho phiên bản thứ hai của đại biểu:
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}
Như bạn có thể thấy, nó là một phương pháp bình thường để thực hiện một cái gì đó . Trong trường hợp của chúng ta, nó trả về kết quả của việc gọi ToString
đối tượng hiện tại của I
.