Tôi chỉ nhận thấy câu hỏi này và muốn thêm 0,02 đô la của mình vào câu hỏi này.
Trong trường hợp của Java, đây thực sự không phải là một tùy chọn. Lỗi "mã không thể truy cập" không xuất phát từ việc các nhà phát triển JVM nghĩ rằng sẽ bảo vệ các nhà phát triển khỏi bất cứ điều gì hoặc cần hết sức cảnh giác, mà là do các yêu cầu của đặc tả JVM.
Cả trình biên dịch Java và JVM, đều sử dụng cái được gọi là "bản đồ ngăn xếp" - một thông tin xác định về tất cả các mục trên ngăn xếp, như được cấp phát cho phương thức hiện tại. Loại của mỗi và mọi vị trí của ngăn xếp phải được biết, để một lệnh JVM không xử lý nhầm mục của một loại cho một loại khác. Điều này chủ yếu quan trọng để ngăn chặn việc có một giá trị số được sử dụng làm con trỏ. Có thể sử dụng Java assembly để cố gắng đẩy / lưu trữ một số, nhưng sau đó bật / tải một tham chiếu đối tượng. Tuy nhiên, JVM sẽ từ chối mã này trong quá trình xác thực lớp, - đó là khi các bản đồ ngăn xếp đang được tạo và kiểm tra tính nhất quán.
Để xác minh các bản đồ ngăn xếp, máy ảo phải đi qua tất cả các đường dẫn mã tồn tại trong một phương thức và đảm bảo rằng bất kể đường dẫn mã nào sẽ được thực thi, dữ liệu ngăn xếp cho mọi lệnh đồng ý với những gì mà bất kỳ mã nào trước đó đã đẩy / được lưu trữ trong ngăn xếp. Vì vậy, trong trường hợp đơn giản của:
Object a;
if (something) { a = new Object(); } else { a = new String(); }
System.out.println(a);
tại dòng 3, JVM sẽ kiểm tra xem cả hai nhánh của 'if' chỉ được lưu trữ vào một (chỉ là var # 0 cục bộ) thứ gì đó tương thích với Object (vì đó là cách mã từ dòng 3 trở đi sẽ xử lý var # 0 cục bộ ).
Khi trình biên dịch nhận được một mã không thể truy cập, nó không hoàn toàn biết trạng thái của ngăn xếp có thể ở thời điểm đó, vì vậy nó không thể xác minh trạng thái của nó. Nó không thể biên dịch mã nữa vào thời điểm đó, vì nó cũng không thể theo dõi các biến cục bộ, vì vậy thay vì để lại sự mơ hồ này trong tệp lớp, nó sẽ tạo ra một lỗi nghiêm trọng.
Tất nhiên một điều kiện đơn giản như if (1<2)
sẽ đánh lừa nó, nhưng nó không thực sự đánh lừa - nó cung cấp cho nó một nhánh tiềm năng có thể dẫn đến mã và ít nhất cả trình biên dịch và máy ảo đều có thể xác định, cách các mục ngăn xếp có thể được sử dụng từ đó trên.
PS Tôi không biết .NET làm gì trong trường hợp này, nhưng tôi tin rằng nó cũng sẽ không biên dịch được. Điều này thường sẽ không phải là vấn đề đối với bất kỳ trình biên dịch mã máy nào (C, C ++, Obj-C, v.v.)