为什么System.Enum不是值类型?

smw*_*dia 9 .net c#

我编写了以下代码用于某些测试,输出超出了我的预期.

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
Run Code Online (Sandbox Code Playgroud)

所以我用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));
}
Run Code Online (Sandbox Code Playgroud)

在MSDN中,System.Enum定义为:

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, IComparable, 
    IFormattable, IConvertible
Run Code Online (Sandbox Code Playgroud)

那么为什么IsValueType以这种方式实现呢?为什么检测到enumType?

Jon*_*eet 16

所有枚举都继承自System.Enum.您不能从值类型继承,因此System.Enum不能是值类型.

它就像System.ValueType不是一种价值类型.从其他规则中得出的只是一点点奇怪.为了给出它可能引起的问题的更具体的例子,请使用以下代码:

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

...

Enum x = Foo.X;
x = Bar.Y;
Run Code Online (Sandbox Code Playgroud)

应该在堆栈上预留多少空间x?它应该是0字节,因为System.Enum它本身没有任何字段(因此在分配时截断数据)?应该是8个字节,以允许最大可能的枚举类型?价值类型继承基本上导致围绕期望的问题,这就是为什么它被禁止(我相信).这些原因适用于枚举和其他类型.