Tôi nghĩ rằng điều này trông giống như một lỗi trong trình biên dịch C#.Tại sao trình biên dịch đánh giá phần còn lại MinValue% -1 khác với thời gian chạy?
xem xét mã này (bên trong một phương pháp):
const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);
Nó biên dịch không có lỗi (hoặc cảnh báo). Có vẻ như một con bọ. Khi chạy, in 0
trên bảng điều khiển.
Sau đó, nếu không có sự const
, mã:
long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);
Khi điều này được chạy, nó kết quả một cách chính xác trong một OverflowException
bị ném.
Đặc tả ngôn ngữ C# đề cập đến trường hợp này một cách cụ thể và cho biết số System.OverflowException
sẽ được ném. Nó không phụ thuộc vào ngữ cảnh checked
hoặc unchecked
có vẻ như (cũng là lỗi với toán hạng hằng số biên dịch thời gian cho toán tử còn lại là giống nhau với checked
và unchecked
).
Lỗi tương tự xảy ra với int
(System.Int32
), không chỉ long
(System.Int64
).
Để so sánh, trình biên dịch xử lý dividend/divisor
với các toán hạng const
tốt hơn nhiều so với dividend % divisor
.
Câu hỏi của tôi:
Tôi có phải là lỗi này không? Nếu có, nó là một lỗi nổi tiếng mà họ không muốn sửa chữa (vì khả năng tương thích ngược, ngay cả khi nó là khá ngớ ngẩn để sử dụng % -1
với một hằng số biên dịch thời gian -1
)? Hay chúng ta nên báo cáo nó để họ có thể sửa chữa nó trong các phiên bản sắp tới của trình biên dịch C#?
Đề cập @EricLippert có thể thu hút đúng người cho câu hỏi này :) –
@Morten, tại thời điểm này, anh ta có thể chỉ nhìn lén lút từ cá rô của mình tại Coverity. ;) –
Tôi nghĩ rằng bạn nên đặt một tiền thưởng về điều này vì nó kích thích tôi tại sao điều này xảy ra. Các thông số kỹ thuật nói rằng bất kỳ biểu thức liên tục có thể ném một ngoại lệ thời gian chạy nên gây ra một lỗi biên dịch thời gian tại biên dịch !! –