【发布时间】:2013-01-11 18:00:32
【问题描述】:
我在EntityFramework 5 类中使用了 Enum 属性, 但在数据库中,该字段可以为空。 Visual Studio 给出此属性必须是可为空的属性的错误。我的问题是:枚举是引用类型还是值类型?
【问题讨论】:
标签: .net enums value-type reference-type
我在EntityFramework 5 类中使用了 Enum 属性, 但在数据库中,该字段可以为空。 Visual Studio 给出此属性必须是可为空的属性的错误。我的问题是:枚举是引用类型还是值类型?
【问题讨论】:
标签: .net enums value-type reference-type
System.Enum 是引用类型,但任何特定枚举类型都是值类型。同理,System.ValueType 是引用类型,但从它继承的所有类型(System.Enum 除外)都是值类型。
所以如果你有一个枚举 Foo 并且你想要一个可以为空的属性,你需要属性类型是 Foo?。
【讨论】:
Foo? 是System.Nullable<Foo> 的糖,Nullable 也是一个值类型。
如果你使用myEnum.SomeValue,它将是一个值类型。
【讨论】:
假设我们有枚举
public enum eCategory
{
health ,
Weapon
}
以及一种 eCategory 类型,例如:-
eCategory currentcategory;
那么 currentcategory 是值类型
【讨论】:
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 变量,而不是改变它指向的对象。