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

标签 c# .net

我写了下面的代码进行一些测试,结果超出了我的预期。

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。您不能从值类型继承,因此 System.Enum 不能是值类型。

就像 System.ValueType 不是值类型一样。这只是其他规则中出现的一点点奇怪。为了给出它可能导致的问题的更具体示例,请使用以下代码:

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

...

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

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

关于c# - 为什么 System.Enum 不是值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2324224/

相关文章:

c# - ASP.NET MVC 最佳实践

c# - 当前上下文中不存在名称 Response

.net - 所有项目的 VB.Net 和命名空间

c# - EVENTTARGET 确定发件人时出现问题

c# - 每个表单/其他字符串仅使用 1 个资源文件而不是 1 个资源文件

c# - 本地对象的垃圾收集

asp.net - 如何在 ASP.NET 网站中禁用 SSL 证书验证

c# - 将 IConfigurationSection 转换为 IOptions

c# - 如何使用 Midi 点网类在 C# 中读取打击乐音符值

c# - LINQ语法问题