2015-11-08 17 views
19

tôi đã rối tung xung quanh với C# dự án của tôi một chút và tôi đã ngạc nhiên khi thấy mã này biên dịch:Tại sao mã sau đây biên dịch mà không có lỗi?

var a = new Action<string>(ref b => b = "hello"); 

Flipping nó theo cách khác xung quanh, như Action<string> a = ref b => b = "hello"; sẽ đưa ra một lỗi cú pháp tại 'ref'.

đủ chắc, sao chép-dán đoạn mã vào http://dotnetfiddle.net đưa ra một lỗi biên dịch:

A ref or out argument must be an assignable variable 

Có tôi gặp phải một lỗi trong trình biên dịch? (Tôi đang sử dụng VS 2015 và C# 6.)


EDIT: Chỉ cần chuyển sang trình biên dịch Roslyn trên NET Fiddle, nó vẫn phát ra những lỗi tương tự.

+2

Tôi đã thử nó tại [tryroslyn] (http://goo.gl/00ZyS0) và có: nó biên dịch - hành vi cũng giống như nếu 'ref' không có ở đó. Trông giống như một lỗi (có thể được báo cáo nếu chưa được thực hiện). –

+2

@LucasTrzesniewski Thật vậy. Tôi đã gửi một vấn đề cho [Roslyn GitHub repo] (https://github.com/dotnet/roslyn/issues/6646) về việc này. –

+0

Lạ. Còn về lambda cú pháp chính xác (ref string b) => b = "hello" '(lưu ý dấu ngoặc đơn và kiểu' string'), nó có thể được chuyển thành 'Action ' với trình biên dịch đó không? Tôi không có quyền truy cập vào trình biên dịch Visual C# 6 ngay bây giờ. –

Trả lời

6

Có vẻ như lỗi trình biên dịch trong VS2015. Đây được nộp như https://github.com/dotnet/roslyn/issues/6646

+1

Không, ý tôi là trong trình biên dịch cho sản phẩm có tên "Visual Studio 2015". –

+0

* "Đó là một lỗi cố ý mà chúng tôi duy trì để không phá vỡ mã hiện tại." *. Nói gì cơ? : - \ –

0

tôi nghĩ rằng trong đầu Action

var a = new Action(ref b => b = "hello");

ref là tài liệu tham khảo cho các hành động hoàn toàn b=>b = "hello"

trong khi thứ hai

Action a = ref b => b = "hello";

ref là tài liệu tham khảo cho b trong ref b => b = "hello"

kiểm tra dưới đây fiddle

+2

Không có quá tải nào của hàm tạo 'Hành động' có tham số ref, do đó, nó vẫn sẽ là lỗi trong trường hợp đầu tiên. –

Các vấn đề liên quan