我为一些测试编写了以下代码,输出超出了我的预期。
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?
答案 0 :(得分:15)
所有枚举都从System.Enum
继承。您不能从值类型继承,因此System.Enum不能是值类型。
就像System.ValueType
不是值类型一样。从其他规则中得出的只是一点点奇怪。为了给出它可能引起的问题的更具体的例子,请使用以下代码:
enum Foo : int { X }
enum Bar : long { Y }
...
Enum x = Foo.X;
x = Bar.Y;
x
的堆栈应该保留多少空间?它应该是0字节,因为System.Enum
本身没有任何字段(因此在分配时截断数据)?应该是8个字节,以允许最大可能的枚举类型?价值类型继承基本上导致围绕期望的问题,这就是为什么它被禁止(我相信)。这些原因和其他类型一样适用于枚举。