为什么System.Enum不是值类型?
我编写了以下代码用于某些测试,输出超出了我的预期。
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
所以我用Reflector检查Type.IsValueType属性的实现。 这是:
public bool get_IsValueType() { return this.IsValueTypeImpl(); } protected virtual bool IsValueTypeImpl() { Type type = this; return (((type != valueType) && (type != enumType)) && this.IsSubclassOf(valueType)); }
在MSDN中,System.Enum定义为:
[SerializableAttribute] [ComVisibleAttribute(true)] public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
那么为什么IsValueType以这种方式实现呢? 为什么检测到enumType?
所有枚举都从System.Enum
inheritance。 您不能从值类型inheritance,因此System.Enum不能是值类型。
就像System.ValueType
不是值类型一样。 从其他规则中得出的只是一点点奇怪。 为了给出它可能引起的问题的更具体的例子,请使用以下代码:
enum Foo : int { X } enum Bar : long { Y } ... Enum x = Foo.X; x = Bar.Y;
x
的堆栈应该保留多少空间? 它应该是0字节,因为System.Enum
本身没有任何字段(因此在分配时截断数据)? 应该是8个字节,以允许最大可能的枚举类型? 价值类型inheritance基本上导致围绕期望的问题,这就是它被禁止的原因(我相信)。 这些原因适用于枚举和其他类型。