2010-02-24 41 views
9

Tôi viết mã sau đây cho một số thử nghiệm, và đầu ra là ngoài mong đợi của tôi.Tại sao System.Enum không phải là một loại giá trị?

public enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };  
Console.WriteLine(typeof(System.Enum).IsValueType.ToString()); // False 
Console.WriteLine(typeof(Days).IsValueType.ToString()); // True 

Vì vậy, tôi kiểm tra với Reflector thi hành Type.IsValueType tài sản. Đó là:

public bool get_IsValueType() 
{ 
    return this.IsValueTypeImpl(); 
} 
protected virtual bool IsValueTypeImpl() 
{ 
    Type type = this; 
    return (((type != valueType) && (type != enumType)) && this.IsSubclassOf(valueType)); 
} 

Trong MSDN, System.Enum được định nghĩa là:

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

Vậy tại sao các IsValueType implentmented như vậy? Tại sao có một phát hiện cho enumType?

Trả lời

16

Tất cả các loại thừa kế thừa kế từ System.Enum. Bạn không thể kế thừa từ một loại giá trị, do đó System.Enum không thể là một loại giá trị.

Nó giống như System.ValueType không phải là một loại giá trị. Nó chỉ là một chút kỳ quặc xuất phát từ phần còn lại của các quy tắc. Để cung cấp cho một ví dụ cụ thể hơn về những vấn đề mà nó sẽ gây ra, lấy mã này:

enum Foo : int { X } 
enum Bar : long { Y } 

... 

Enum x = Foo.X; 
x = Bar.Y; 

Bao nhiêu không gian nên dành trên stack cho x? Nếu nó là 0 byte, vì chính bản thân nó không có bất kỳ trường nào (do đó cắt xén dữ liệu khi gán)? Có nên là 8 byte để cho phép loại enum lớn nhất có thể không? Thừa kế loại giá trị cơ bản dẫn đến các vấn đề xung quanh kỳ vọng, đó là lý do tại sao nó bị cấm (tôi tin). Những lý do này áp dụng cho enums nhiều như các loại khác.

+0

Cảm ơn Jon. Điều đó làm tôi bối rối. Hai câu hỏi tôi có. 1) Nếu System.ValueType không phải là một loại giá trị, sau đó làm thế nào để tìm hiểu xem một loại là loại giá trị hay không? 2) trong ví dụ trên, bạn có thể chỉ định một loại giá trị (Foo.x) cho một loại tham chiếu (Enum) ngầm, những gì về boxing và unboxing? – KFL

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