枚举是引用类型还是值类型?

Posted

技术标签:

【中文标题】枚举是引用类型还是值类型?【英文标题】:Enum is Reference Type or Value Type? 【发布时间】:2013-01-11 18:00:32 【问题描述】:

我在EntityFramework 5 类中使用了 Enum 属性, 但在数据库中,该字段可以为空。 Visual Studio 给出此属性必须是可为空的属性的错误。我的问题是:

【问题讨论】:

【参考方案1】:

System.Enum 是引用类型,但任何特定枚举类型都是值类型。同理,System.ValueType 是引用类型,但从它继承的所有类型(System.Enum 除外)都是值类型。

所以如果你有一个枚举 Foo 并且你想要一个可以为空的属性,你需要属性类型是 Foo?

【讨论】:

值得注意的是Foo?System.Nullable<Foo> 的糖,Nullable 也是一个值类型。【参考方案2】:

如果你使用myEnum.SomeValue,它将是一个值类型。

【讨论】:

【参考方案3】:

假设我们有枚举

public enum eCategory

    health ,        
    Weapon

以及一种 eCategory 类型,例如:-

eCategory currentcategory;

那么 currentcategory 是值类型

【讨论】:

【参考方案4】:
public enum TestReferenceOrValue

    one, two, three    

var a = TestReferenceOrValue.one;
var b = a;
b = TestReferenceOrValue.three;

如果枚举是通过引用,更改b 会影响aConsole.Write(a); → 一个Console.Write(b); → 三个

一个很棒的 cSharp 在线工具 => http://csharppad.com/

【讨论】:

我对您显示的错误编程约定投了反对票。枚举字段应以大写字母开头。 上面的代码示例没有帮助,因为它不管TestReferenceOrValue是引用类型还是值类型都是一样的。 var a = "a"; var b = a; b = "b"; Console.Write(a); Console.Write(b); 表明字符串(和每种类型)都以这种方式运行 - 而string 是一个引用类型。那是因为您覆盖 b 变量,而不是改变它指向的对象。

以上是关于枚举是引用类型还是值类型?的主要内容,如果未能解决你的问题,请参考以下文章

006.值类型引用类型枚举类型字符串冒泡排序

【PHP】值为1的string类型,转成int类型后值变成了0?

AutoMapper 可以在值类型(枚举)和引用类型之间进行映射吗? (细绳)

引用类型和值类型

C# 值类型和引用类型

PHP变量名、变量值、类型