2010-02-24 31 views
9

MSDN định nghĩa System.Enum như một lớp trừu tượng:Tại sao tôi không thể lấy được từ lớp trừu tượng System.Enum?

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible 

Và cũng MSDN làm cho tuyên bố như vậy về lớp trừu tượng:

Một lớp trừu tượng không thể khởi tạo. Mục đích của lớp trừu tượng là cung cấp một định nghĩa phổ biến của một lớp cơ sở mà nhiều lớp dẫn xuất có thể chia sẻ.

Nhưng tôi không thể lấy được từ System.Enum. Theo Jeffery Richter trong cuốn sách của mình "CLR via C#", nó là trình biên dịch C# mà cấm đạo hàm đó.

Và tôi đã kiểm tra các thành viên của System.Enum, hầu hết trong số đó là tĩnh, hợp lý cho nó không thể được khởi tạo và phương thức tĩnh không cần một cá thể đối tượng để gọi. Nhưng cũng có một số phương thức thể hiện, chẳng hạn GetHashCode() và GetTypeCode().

Vì vậy, câu hỏi đầu tiên của tôi là, nếu System.Enum không có thể được khởi tạo hoặc có nguồn gốc, làm thế nào có thể những phương pháp dụ được gọi? Đây không phải là một loại nghịch lý?

Tôi biết tôi có thể sử dụng phương thức sau để gọi các phương thức dụ này, nhưng tại sao? Có một số loại của System.Enum hoặc loại có nguồn gốc đối tượng dụ được tạo? Khi nào? và ai?

public enum Days:byte { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; 
Days d = Days.Friday; 
d.GetTypeCode(); 
d.GetHashCode(); 
+0

Ngày có nguồn gốc từ enum ... sự nhầm lẫn của bạn là gì? –

Trả lời

7

Bạn có thể lấy được từ Enum, ví dụ:

public enum MyEnum 
{ 
    // ... 
} 

sẽ được biên dịch xuống một cái gì đó như:

.class public auto ansi sealed MyEnum 
    extends System.Enum 
{ 
    // ... 
} 

Hạn chế các biên dịch C# nơi là nó sẽ không cho phép bạn viết các nguồn gốc bằng tay, nhưng thay vì đòi hỏi bạn phải sử dụng từ khóa enum khi khai báo kiểu.

Về lý do tại sao đây là ... tôi đoán là bởi vì liệt kê là một chút lạ trong CLR. Ví dụ: các loại cơ sở ValueTypeEnum là cả hai loại tham chiếu, không phải là loại giá trị. Có một loạt các phép thuật đang diễn ra dưới vỏ bọc, và nếu bạn ép buộc sử dụng từ khóa và ngăn chặn nguồn gốc từ lớp cơ sở ma thuật, thì bạn đang giữ ý định của mình tách biệt khỏi ma thuật.

+0

Cảm ơn, Greg. Câu trả lời của bạn đã giải quyết được một phần vấn đề của tôi. Bây giờ tôi tự hỏi tại sao không cho phép chúng tôi chỉ mở rộng System.Enum trực tiếp? – smwikipedia

+0

@smwikipedia - Chỉ cần thêm dự đoán của tôi là tại sao lại như vậy. Bạn sẽ phải có được một trong những nhà thiết kế ngôn ngữ C# để xác minh nó mặc dù (Eric Lippert là ở đây thường xuyên để anh có thể dừng lại với bất kỳ may mắn). –

+0

cảm ơn, tôi đã gửi thư cho Eric Lippert và hy vọng anh ấy có thể trả lời sớm. – smwikipedia

0

Enums là kiểu giá trị mà tại sao bạn không thể instanctiate hoặc lấy được từ nó. Các phương thức thể hiện như GetHashCode() chỉ xuất hiện cho các đối tượng kiểu tham chiếu như các lớp.

Các vấn đề liên quan