Tại sao trình biên dịch C # cho phép một biến trùng lặp trong phạm vi lồng nhau?


18

Trong lịch sử, khi phát triển trong .Net tôi không thể sao chép tên của biến trong phạm vi lồng nhau. Tuy nhiên, sau khi cập nhật Visual Studio 2019 lên phiên bản 16.4.2 gần đây, tôi nhận thấy rằng các tên biến có thể được nhân đôi trong phạm vi lồng nhau.

Ví dụ:

var test = "hello";
Console.WriteLine(test);
var things = new []{"one", "two", "three"};
things.Select(test => // <- test is duplicated here, normally this breaks compilation
{
    Console.WriteLine(test);
    return test;
}).ToList();

// output:
// hello
// one
// two
// three

https://dotnetfiddle.net/h85BK4

Tại sao điều này đột nhiên được cho phép?

Câu hỏi tiếp theo: Nếu đây là một "tính năng" ngôn ngữ mới, có cách nào để cấu hình Visual Studio tiếp tục ngắt khi một biến được nhân đôi trong phạm vi lồng nhau không?


2
tôi không nghĩ rằng nó cho phép biến trùng lặp. nó sử dụng cùng một testbiến vì kiểu dữ liệu là như nhau. thử khai báo testbiến như int vd. var test = 12345;tôi nghĩ bạn sẽ nhận được lỗi biên dịch. (Tôi chưa thử)
LP13

1
@ LP13 Thay đổi loại testnhư được đề xuất không có hiệu lực. Bạn có thể thử nó trong Fiddle được liên kết trong câu hỏi.
Amy

1
Nevermind, khung mục tiêu là không liên quan. Các hành vi mới là do phiên bản ngôn ngữ. Mã biên dịch trên C # 8, nó không biên dịch trên C # 7.3 (và dưới đây tôi giả sử)
Emanuel Vintilă


6
vấn đề GitHub cho điều đó. Cột mốc được đặt thành 16,5. @OrkhanAlikhanov bạn đã tìm thấy nó nhanh hơn :)
Pavel Anikhouski

Câu trả lời:


1

Đây là một tính năng mới trong C # 8.0, chức năng cục bộ và tham số lambda có thể phủ bóng tên bên ngoài.


0

Tôi đoán là hàm select đang được biên dịch thành tĩnh vì nó không có kết nối với thân phương thức máy chủ. nó chỉ in và trả về các mục trong câu hỏi. điều này không yêu cầu bất kỳ quyền truy cập nào vào phương thức và vì vậy, nó có thể vì lý do tối ưu hóa được chuyển ra khỏi thân phương thức và tự đặt nó trong phạm vi toàn cầu.

và trong trường hợp này, biến kiểm tra đó là biến riêng và không có kết nối với biến kiểm tra trên.

để ngăn chặn điều này, bạn không thể yêu cầu vs ném lỗi khi xảy ra, bạn sẽ chỉ cần thay đổi tên biến theo cách thủ công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.