Cập nhật: Đây không còn là một vấn đề từ C# 6, trong đó đã giới thiệu các nhà điều hành nameof
để giải quyết các tình huống như vậy (xem MSDN).
Có vẻ như câu trả lời cho câu hỏi của tôi là no; tính năng này không được chuẩn hóa. Tình hình có vẻ thậm chí còn khao khát hơn ban đầu tôi ngờ; không chỉ là thúc đẩy các biến bị bắt không được tiêu chuẩn hóa, mà còn là toàn bộ đặc điểm kỹ thuật của việc chuyển đổi các hàm ẩn danh thành các biểu diễn cây biểu thức của chúng.
Hàm ý của việc này là các chức năng ẩn danh thậm chí đơn giản, chẳng hạn như dưới đây, không đảm bảo dẫn đến cây biểu hiện nhất quán trên hiện thực khác nhau của khuôn khổ này (cho đến khi chuyển đổi được tiêu chuẩn hóa):
Expression<Func<int, int, int>> add = (int x, int y) => x + y;
Các trích đoạn sau được lấy từ số C# Language Specification 4.0 (nhấn mạnh được thêm vào trong mọi trường hợp).
Từ “loại cây 4,6 Expression”:
Định nghĩa chính xác của các loại generic Expression<D>
cũng như các quy tắc chính xác để xây dựng một cây biểu hiện khi một chức năng ẩn danh được chuyển thành một loại cây biểu thức, nằm ngoài phạm vi của đặc điểm kỹ thuật này và được mô tả ở nơi khác.
Từ “6.5.2 Thẩm định chuyển đổi chức năng ẩn danh với các loại cây khái niệm”:
chuyển đổi của một chức năng ẩn danh với một loại cây biểu thức tạo ra một cây biểu thức (§4.6). Chính xác hơn, việc đánh giá chuyển đổi hàm ẩn danh dẫn đến việc xây dựng một cấu trúc đối tượng đại diện cho cấu trúc của chính hàm ẩn danh đó. Cấu trúc chính xác của cây biểu thức, cũng như quy trình chính xác để tạo ra nó, được thực hiện xác định.
Ví dụ thứ ba trong “6.5.3 Ví dụ thực hiện” thể hiện việc chuyển đổi một chức năng ẩn danh cho phép chụp một biến địa phương, và khẳng định việc thúc đẩy biến đề cập trong câu hỏi của tôi:
Thời gian tồn tại của biến cục bộ bây giờ phải được kéo dài đến ít nhất là tuổi thọ của ủy nhiệm hàm ẩn danh. Điều này có thể đạt được bằng cách "nâng" biến cục bộ vào một trường của một trình biên dịch tạo ra lớp. Sự khởi tạo biến cục bộ (§7.15.5.2) sau đó tương ứng với việc tạo ra một cá thể của trình biên dịch tạo ra lớp, và truy cập biến cục bộ tương ứng với việc truy cập một trường trong cá thể của trình biên dịch tạo ra lớp.
này là tiếp tục chứng thực vào cuối phần:
Kỹ thuật tương tự áp dụng ở đây để nắm bắt các biến địa phương cũng có thể được sử dụng khi chuyển đổi chức năng ẩn danh để cây biểu thức: Tài liệu tham khảo cho các đối tượng biên dịch tạo có thể được lưu trữ trong cây biểu thức và truy cập vào các biến cục bộ có thể được biểu diễn dưới dạng truy cập trường trên các đối tượng này. Ưu điểm của phương pháp này là nó cho phép các biến cục bộ "nâng" được chia sẻ giữa các đại biểu và cây biểu thức.
Tuy nhiên, có một khuyến cáo tại trang đầu của bộ phận:
Việc thực hiện mô tả ở đây được dựa trên cùng một nguyên tắc được sử dụng bởi # biên dịch Microsoft C, nhưng nó được bởi không có nghĩa là một thực hiện bắt buộc, cũng không phải là người duy nhất có thể. Nó chỉ đề cập một cách ngắn gọn các chuyển đổi đối với các cây biểu thức, vì ngữ nghĩa chính xác của chúng nằm ngoài phạm vi của đặc tả này.
P.S. Eric Lippert confirms in this comment rằng thông số cây biểu thức chưa bao giờ được gửi. Có tồn tại một Expression Trees v2 Spec theo tài liệu DLR trên CodePlex, nhưng phạm vi của nó không xuất hiện để bao gồm việc chuyển đổi các hàm ẩn danh thành biểu thức cây trong C#.
Bạn có thể nắm bắt các lựa chọn thay thế tại đây: http://stackoverflow.com/questions/72121/finding-the-variable-name-passed-to-a-function-in-c-sharp nhưng sau đó lại không có giấy tờ. Cách tiếp cận kiểu ẩn danh nhanh hơn nhiều mặc dù .. – nawfal