Các câu trả lời khác cho biết bạn đã thay đổi chữ ký của một phương thức và do đó phải biên dịch lại người gọi, là chính xác.Tôi nghĩ tôi có thể thêm một số thông tin bổ sung về câu hỏi này của bạn:
Có vẻ như ở tất cả các trang gọi đến phương thức này, không sử dụng giá trị trả lại (vì nó không tồn tại trước đây).
Điều đó hoàn toàn chính xác. Bây giờ, hãy xem xét câu hỏi này: làm thế nào để bạn viết mã rằng không sử dụng dữ liệu? Bạn dường như lao động theo giả định hoàn toàn sai rằng không sử dụng giá trị không yêu cầu mã, nhưng không sử dụng giá trị chắc chắn yêu cầu mã!
Giả sử bạn có phương pháp:
static int M1(int y) { return y + 1; }
static void M2(int z) { ... }
và bạn có một cuộc gọi
int x;
x = M1(123);
gì xảy ra ở cấp IL? như sau:
- Không gian phân bổ trên nhóm tạm thời cho x.
- Đẩy 123 trên ngăn xếp
- Gọi M1.
- Đẩy 1 vào ngăn xếp. Ngăn xếp bây giờ là 1, 123
- Thêm hai thứ trên cùng vào ngăn xếp. Điều này xuất hiện cả hai và đẩy kết quả. Ngăn xếp tại là 124.
- Quay lại gọi
- Các ngăn xếp vẫn là 124.
- Store giá trị trên stack vào lưu trữ tạm thời cho x. Điều này bật ngăn xếp, do đó, ngăn xếp hiện đang trống.
Giả sử bây giờ bạn làm:
M1(345);
gì sẽ xảy ra? Cùng một điều:
- Đẩy 345 trên stack
- Gọi M1.
- Đẩy 1 vào ngăn xếp. Ngăn xếp bây giờ là 1, 345
- Thêm hai thứ trên cùng vào ngăn xếp. Điều này xuất hiện cả hai và đẩy kết quả. Ngăn xếp tại là 346.
- Quay lại gọi
- Các ngăn xếp vẫn là 346.
Nhưng không có hướng dẫn mà các cửa hàng giá trị trên stack bất cứ nơi nào, vì vậy chúng ta phải đưa ra một hướng dẫn pop:
- Bật giá trị chưa sử dụng khỏi ngăn xếp.
Bây giờ giả sử bạn gọi
M2(456);
gì sẽ xảy ra?
- Đẩy 456 trên ngăn xếp
- Gọi M2.
- M2 thực hiện điều đó. Khi nó trở về người gọi, ngăn xếp trống vì nó không có hiệu lực.
- Ngăn xếp hiện đang trống, vì vậy đừng bật bất cứ thứ gì.
Bây giờ, bạn có thấy lý do tại sao thay đổi phương thức không có hiệu lực trở về giá trị trả lại là thay đổi không? Mọi người gọi hiện phải bật giá trị không được sử dụng khỏi ngăn xếp. Làm không có gì với dữ liệu vẫn yêu cầu phải làm sạch nó lên ngăn xếp. Bạn đang sắp xếp lại ngăn xếp nếu bạn không bật giá trị đó; CLR yêu cầu ngăn xếp là trống ở đầu mỗi tuyên bố để đảm bảo rằng loại sai lệch này không xảy ra.
Nguồn
2012-02-07 15:55:42
Đã chỉnh sửa ví dụ của tôi. Quan điểm của tôi là phương thức trả về một cái gì đó ngay bây giờ; nhưng tất cả các mã mà trước đó sử dụng nó không làm bất cứ điều gì với nó. Hoàn toàn hợp pháp để viết mã như vậy. –