Có điều gì đó mà tôi không thể hiểu được trong C#. Bạn có thể bỏ ra một phạm vi ngoài phạm vi int
thành một enum
và trình biên dịch không nao núng. Hãy tưởng tượng này enum
:Đúc ints vào enums trong C#
enum Colour
{
Red = 1,
Green = 2,
Blue = 3
}
Bây giờ, nếu bạn viết:
Colour eco;
eco = (Colour)17;
Trình biên dịch cho rằng đó là tốt. Và thời gian chạy cũng vậy. Uh?
Tại sao nhóm C# quyết định thực hiện việc này? Quyết định này bỏ lỡ điểm của việc sử dụng enums, tôi nghĩ rằng, trong tình huống như thế này:
void DoSomethingWithColour(Colour eco)
{
//do something to eco.
}
Trong một ngôn ngữ mạnh mẽ, đánh máy như C#, tôi muốn cho rằng eco
sẽ luôn luôn giữ một giá trị pháp lý Colour
. Nhưng đây không phải là trường hợp. Lập trình viên có thể gọi phương thức của tôi với giá trị 17 được gán cho eco
(như trong đoạn mã trước), vì vậy mã trong phương thức của tôi không được giả định rằng eco
giữ giá trị Colour
hợp pháp. Tôi cần phải kiểm tra nó một cách rõ ràng và xử lý các giá trị đặc biệt như tôi xin vui lòng. Tại sao điều này?
Trong thiển ý của tôi, nó sẽ đẹp hơn nhiều nếu trình biên dịch đưa ra một lỗi (hoặc thậm chí là một cảnh báo) thông báo khi đúc một out-of phạm vi int
thành một enum
, nếu giá trị int
được biết đến tại thời gian biên dịch. Nếu không, thời gian chạy phải ném một ngoại lệ tại câu lệnh gán.
Bạn nghĩ sao? Có lý do nào tại sao điều này là như vậy?
(. Lưu ý Đây là một câu hỏi I posted ages ago on my blog nhưng đã không có phản ứng nhiều thông tin.)
Điểm của bạn là gì? :-) Nếu bạn muốn làm cho SouthEast trở thành một hướng hợp lệ, tôi nghĩ bạn nên đưa nó vào khai báo enum là SouthEast = 10 chẳng hạn. Đồng ý? – CesarGon
Chúng được gọi là bảng liệt kê cờ. Rất vaild thiết kế. –
Không, không đồng ý. Các trường bit là việc sử dụng một enum hoàn toàn hợp lệ, rất nhiều để thuộc tính [Flags] thậm chí không cần thiết để sử dụng chúng như vậy. –