tôi stumbled khi điều kỳ lạ này ngày hôm nay:Tại sao bản dịch này không được biên dịch?
http://www.yoda.arachsys.com/csharp/teasers.html
Câu hỏi # 5.
Mã:
using System;
class Test
{
enum Foo
{
Bar,
Baz
};
const int One = 1;
const int Une = 1;
static void Main()
{
Foo f = One - Une;
Console.WriteLine(f);
}
}
Bây giờ theo các câu trả lời trên http://www.yoda.arachsys.com/csharp/teasers-answers.html cho câu hỏi # 5
... Đó là một lỗi được biết do một số tối ưu hóa được thực hiện quá sớm, thu hằng của 0 và nghĩ rằng bất kỳ 0 hằng số đã biết nào phải được chuyển đổi thành giá trị 0 của bất kỳ enum nào. Đó là với chúng tôi bây giờ, và dường như không bao giờ được cố định vì nó có thể phá vỡ một số mã đó là kỹ thuật bất hợp pháp nhưng làm việc hoàn toàn tốt. Có thể là thông số kỹ thuật sẽ thay đổi thay vào đó, tất nhiên.
Nhưng tại sao?
One
& Une
đều là const. I E. chúng có thể được tính toán thời gian biên dịch, vì vậy nó sẽ trở thành Foo f = 0
. Và kể từ 0
là giá trị hợp lệ cho bất kỳ enum
, tại sao bản dịch này không được biên dịch?
Bạn đang tìm kiếm một cái gì đó như thế này 'Foo f' và sau đó' f.Bar = One - Une; 'phải không? –
Bởi vì có lẽ kiểm tra "là nó một số nguyên không đổi? Nếu có, là nó 0? Sau đó nó là ok để ngầm đúc nó vào một enum" được thực hiện TRƯỚC KHI tính toán liên tục. – xanatos
Loại an toàn. Ngay cả khi enum của bạn được hỗ trợ bởi một int, enum của bạn là * không * một int. Nó đại diện cho các khái niệm riêng của nó, và như vậy, gán một int cho một enum không phải là cách chính xác để làm việc với nó. –