Nếu int
đồng nghĩa với Int32
tại saoC# int, Int32 và enums
enum MyEnum : Int32
{
Value = 1
}
... không biên dịch? Ở đâu là
enum MyEnum : int
{
Value = 1
}
sẽ, mặc dù di con trỏ qua từ int sẽ hiển thị struct System.Int32?
Nếu int
đồng nghĩa với Int32
tại saoC# int, Int32 và enums
enum MyEnum : Int32
{
Value = 1
}
... không biên dịch? Ở đâu là
enum MyEnum : int
{
Value = 1
}
sẽ, mặc dù di con trỏ qua từ int sẽ hiển thị struct System.Int32?
Loại cơ bản thực sự giống nhau, nhưng trình biên dịch phụ thuộc vào loại được làm bí danh chính xác. Đây là lỗi biên dịch dựa trên phân tích cú pháp. Tôi đã xem xét đặc tả ngữ pháp C# và các loại cơ bản được xác định ở đó là các mã thông báo dựa trên bí danh (ví dụ: 'int', 'unit' ... v.v.). Trình phân tích cú pháp dự kiến các chuỗi cụ thể từ các quy tắc ngữ pháp tích phân.
Lỗi này là lỗi phân tích mặc dù cả hai enum Enum : int
có nghĩa là giống như enum Enum : Int32
.
Tôi không biết lý do buộc phải giới hạn bước phân tích cú pháp này, nhưng tôi có thể thử đoán: Vì Int32 không phải là từ khóa nên nó có thể ám chỉ đến cấu trúc int thực tế khác. Nếu trình phân tích cú pháp phải biết loại để xây dựng khác nhau AST cho mỗi loại cơ sở thì nó không thể phụ thuộc vào mã thông báo mà không phải là một từ khóa.
Mặc dù C# đặc điểm kỹ thuật xác định từ khóa int như bí danh rõ ràng System.Int32, nó vẫn còn là một vấn đề để có được thông tin này về loại rõ ràng (Int32) trong quá trình phân tích bước vì nó đòi hỏi rất nhiều thông tin bối cảnh không thể suy ra ở bước này.
Xem thêm lỗi này của MS Connect nơi chúng giải thích lý do không thay đổi bahvior : http://connect.microsoft.com/VisualStudio/feedback/details/557064/c-enum-declaration-only-accept-value-type-alias-eg-ngắn-int-long-thay-cho-net-valuetype-eg-system-int16-system- int32-system-int64 –
@MichaelEdenfield không thể truy cập liên kết Microsoft Connect. Bạn có thể kiểm tra nó sẽ được hiển thị công khai? Tôi nhận được lỗi này 'Không thể tìm thấy nội dung bạn yêu cầu hoặc bạn không có quyền xem nội dung đó. Nếu bạn cho rằng mình đã truy cập trang này do lỗi, hãy nhấp vào liên kết Trợ giúp ở đầu trang để báo cáo sự cố và bao gồm ID này trong e-mail của bạn: e4c85df6-9343-4045-88d2-fc2d64bd01de ' –
Không, tiếc là họ hết hạn các liên kết kết nối sau một số điểm nhất định. Ý chính của lỗi là "int" là một từ khóa và "Int32" là một kiểu, và trình phân tích cú pháp hiện đang mong đợi một "từ khóa" hợp lệ làm kiểu cơ sở enum. Thay đổi hành vi yêu cầu thay đổi thứ tự của các bước thay thế từ khóa thành loại so với loại phân tích cú pháp và là một thay đổi lớn cho một lợi ích nhỏ bé, vì vậy nó sẽ không xảy ra (trừ khi có những thay đổi liên quan khác trong cùng một khu vực.) –
Một sự tò mò quen thuộc ... các bang ngôn ngữ spec (14.1):
Một tuyên bố enum có thể tuyên bố một cách rõ ràng một loại cơ bản của byte, SByte, ngắn, ushort, int, uint, dài hoặc ulong. Lưu ý rằng char không thể được sử dụng như một loại cơ bản. Một khai báo enum không khai báo rõ ràng một kiểu cơ bản có một kiểu int cơ bản.
Nhưng kể từ int
là thường chỉ là một bí danh cho System.Int32
nó không phải là bất hợp lý để suy nghĩ hoặc có thể làm việc ... nhưng thực sự nó không. Nó thường không phải là một vấn đề lớn, nhưng hấp dẫn không kém.
Lỗi tại thời điểm biên dịch là gì? – Donnie
@Donnie: Nhập byte, sbyte, ngắn, ushort, int, uint, long hoặc ulong mong đợi. Rõ ràng, một hạn chế trong. Net buộc người dùng chỉ sử dụng từ khóa thay vì tên lớp trong một enum. – Webleeuw
Thú vị. Đã học được điều gì đó, yay! – Donnie