Thú vị câu hỏi.
Trước tiên, hãy xem xét sự khác biệt giữa các phương thức ẩn danh và lambdas. Từ quan điểm của nhà biên dịch trình biên dịch, sự khác biệt quan trọng nhất là lambdas có thể yêu cầu trình biên dịch suy ra loại tham số từ đích mà lambda đang được gán; Các phương thức ẩn danh C# 2 không có tính năng này. Tính năng này có vẻ như một sự khác biệt nhỏ nhưng trên thực tế nó có các nhánh chính về việc thực hiện trình biên dịch. Xem loạt blog của tôi về vấn đề này đối với một số suy nghĩ về lý do tại sao đó là:
http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx
Vì vậy, bây giờ hãy đến với câu hỏi thực tế của bạn: tại sao chúng ta không thể suy ra outness/refness từ loại mục tiêu để các thông số của lambda. Tức là, nếu chúng ta có đại biểu void D (out int x) thì chắc chắn D d = x => {x = 10; } có thể suy ra rằng x là "out int".
Không có lý do kỹ thuật nào tôi biết tại sao chúng tôi không thể làm điều đó. Bên trong trình biên dịch, các kiểu ra/ref được biểu diễn dưới dạng các kiểu khác.
Tuy nhiên, các tính năng không được thực hiện chỉ vì chúng có thể được thực hiện; chúng được thực hiện bởi vì có một lý do thuyết phục để làm như vậy.Đối với lambdas, lý do thuyết phục để làm suy luận kiểu ở nơi đầu tiên là LINQ; chúng ta muốn có thể làm một phép biến đổi cú pháp đơn giản trên một truy vấn hiểu vào một lời gọi phương thức với lambdas, và để cho phương thức suy luận kiểu phương thức làm việc ra các kiểu của tất cả các tham số lambda. Không có phương thức LINQ nào được tạo ra có đại biểu với tham số out hoặc ref.
Vì vậy, chúng tôi không có lý do thuyết phục để thực hiện tính năng này. Các đại biểu có tham số out/ref khá hiếm. Và phân công lambdas cho những đại biểu đó vẫn còn hiếm hơn. Vì vậy, đây là một tính năng mà chúng ta không cần, và điều đó hầu như không có lợi ích gì cả.
C# 3 là "cực dài" trên lịch biểu của Visual Studio; chúng tôi đã có số ngày làm việc nhiều nhất theo lịch trình của bất kỳ đội nào vận chuyển một thành phần trong VS. Điều đó có nghĩa là mỗi ngày chúng tôi đã xóa lịch biểu, toàn bộ sự phân chia được phân chia bị trượt. Đó là một sự nản chí mạnh mẽ để dành thời gian cho những tính năng không cần thiết mà không có ai hưởng lợi. Vì vậy, công việc không bao giờ được thực hiện.
Tôi đồng ý rằng sẽ tốt hơn nếu phù hợp hơn ở đây, nhưng điều này không xảy ra. Chúng tôi có nhiều ưu tiên cao hơn.
Nguồn
2010-01-02 20:49:24
Tôi rất tò mò về điều này. Hãy hy vọng Eric Lippert nhận thấy bài đăng này ... anh ấy là người thích nhất để có thể đưa ra một câu trả lời có ý nghĩa cho điều này. – LBushkin
LBushkin, nếu bạn muốn thu hút sự chú ý của mình, bạn luôn có thể gửi cho tôi qua liên kết liên hệ trên blog của tôi. –
Đối với các phương thức nặc danh với từ khóa 'delegate', quy tắc là bạn không xác định gì (bỏ qua cả dấu ngoặc đơn'() ') hoặc chỉ định chữ ký đầy đủ bao gồm các kiểu tham số và biến tố như' ref'/'out'. Vì vậy, 'ref' /' out' không là ngoại lệ. Đối với lambdas, ý tưởng của bạn có ý nghĩa nhưng tôi không chắc chắn nếu tôi nghĩ rằng đó là một ý tưởng tốt. Cú pháp '(out t) => {...}' làm cho nó trông giống như "out" là kiểu tham số. Sau đó 't => {...}' là tốt hơn, nhưng nó có thể là "nguy hiểm" nếu ai đó quên ý nghĩa của 'D' và chỉnh sửa nội dung' {...} 'của lambda mà không nhận ra' out' bản chất của 't'. –