Bằng sự hiểu biết của tôi về phạm vi, ví dụ đầu tiên nên được tốt.
Hiểu biết về phạm vi của bạn là tốt. Đây không phải là lỗi phạm vi. Việc sử dụng tên lỗi đơn giản không phù hợp.
int i = 10; // lỗi, 'i' đã tồn tại
Đó không phải lỗi được báo cáo. Lỗi được báo cáo là "biến cục bộ có tên i không thể được khai báo trong phạm vi này vì nó sẽ đưa ra một ý nghĩa khác với i đã được sử dụng trong phạm vi con để biểu thị cái gì khác"
Thông báo lỗi là nói cho bạn biết lỗi là gì; đọc lại thông báo lỗi. Nó hư không nói rằng có một xung đột giữa các tuyên bố; nó nói rằng lỗi là vì nó thay đổi ý nghĩa của tên đơn giản. Lỗi là không việc xác nhận lại; nó là hoàn toàn hợp pháp để có hai điều trong hai phạm vi khác nhau có cùng tên, ngay cả khi những phạm vi làm tổ. không phải là hợp pháp là phải có một tên đơn giản nghĩa là hai thứ khác nhau trong các khai báo biến cục bộ lồng nhau.
Bạn sẽ nhận được lỗi "một biến địa phương đặt tên tôi đã được xác định trong phạm vi này" nếu thay vào đó bạn đã làm một cái gì đó giống như
int i = 10;
int i = 10;
Chắc chắn 'i' là một trong hai trong phạm vi hay không.
Chắc chắn - nhưng vậy thì sao? Liệu một i nhất định có nằm trong phạm vi hay không là không liên quan. Ví dụ:
class C
{
int i;
void M()
{
string i;
Hoàn toàn hợp pháp. Các i bên ngoài là trong phạm vi trong suốt M. Không có vấn đề gì cả với tuyên bố một i địa phương mà bóng tối phạm vi bên ngoài. Điều gì sẽ là một vấn đề nếu bạn nói
class C
{
int i;
void M()
{
int x = i;
foreach(char i in ...
Vì bây giờ bạn đã sử dụng i để có nghĩa là hai thứ khác nhau trong hai không gian khai báo biến cục bộ lồng nhau - một biến vòng lặp và một trường. Đó là khó hiểu và dễ bị lỗi, vì vậy chúng tôi làm cho nó bất hợp pháp.
Có điều gì không rõ ràng về phạm vi tôi không hiểu có nghĩa là trình biên dịch thực sự không thể giải quyết vấn đề này?
Tôi không hiểu câu hỏi. Rõ ràng là trình biên dịch là có thể phân tích hoàn toàn chương trình; nếu trình biên dịch không thể giải quyết ý nghĩa của mỗi lần sử dụng i thì làm thế nào nó có thể báo cáo thông báo lỗi? Trình biên dịch hoàn toàn có thể xác định rằng bạn đã sử dụng 'i' có nghĩa là hai thứ khác nhau trong cùng một không gian khai báo biến cục bộ và báo cáo lỗi tương ứng.
Nó giống như luật dây an toàn. Không có lý do kỹ thuật nào khiến bạn không thể lái xe mà không có ai, nhưng đó là một công việc tốt luật tồn tại để ngăn bạn, vì nó có thể cứu bạn khỏi một số va chạm rất khó chịu –