2010-02-24 17 views
9

Bazı testler için aşağıdaki kodu yazdım ve çıktı beklentimden çıktı.Neden System.Enum bir değer türü değil?

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 

Yani Reflektör Type.IsValueType özelliğinin uygulanmasını denetlemek. Hangisi:

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

Sonra IsValueType bu şekilde implentmented neden:

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

, System.Enum olarak tanımlanır? Neden enumType için bir tespit var?

cevap

16

Tüm numaralar System.Enum'dan devralınır. Bir değer türünden miras alamazsınız, bu nedenle System.Enum bir değer tipi olamaz.

Tıpkı System.ValueType bir değer değil gibi. Bu, kuralların geri kalanından çıkan hafif bir tuhaflık. o neden olacağı sorunların daha somut bir örnek vermek gerekirse, bu kodu almak: x için yığın ayrılmalıdır ne kadar alan

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

... 

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

? 0 bayt olsun, System.Enum'un kendisinde hiç alan yok (böylelikle ödev verilerinin kesilmesi)? Mümkün olan en büyük enum türüne izin vermek 8 bayt mı olmalıdır? Değer tipi miras temel olarak beklentilerle ilgili sorunlara yol açar, bu yüzden yasaklanmıştır (inanıyorum). Bu sebepler, diğer türlere olduğu kadar enumlar için de geçerlidir.

+0

Teşekkürler Jon. Bu beni şaşırtıyor. Benim iki sorum var. 1) System.ValueType bir değer türü değilse, bir türün değer türü olup olmadığını nasıl öğrenebilirim? 2) Yukarıdaki örnekte, bir referans türüne (Enum) örtülü olarak bir değer tipi (Foo.x) atayabilirsiniz, boks ve kutuklama nedir? – KFL

İlgili konular