64

I used Enum property in my EntityFramework 5 class, but in the database this field is nullable. Visual studio gives the error that this property must be a nullable property. My question is: is Enum a reference type or a value type?

PF_learning
  • 25
  • 13

4 Answers4

103

System.Enum is a reference type, but any specific enum type is a value type. In the same way, System.ValueType is a reference type, but all types inheriting from it (other than System.Enum) are value types.

So if you have an enum Foo and you want a nullable property, you need the property type to be Foo?.

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
16

If you do myEnum.SomeValue it will be a value type.

CodeNotFound
  • 22,153
  • 10
  • 68
  • 69
fhnaseer
  • 7,159
  • 16
  • 60
  • 112
5

suppose we have enum

public enum eCategory
{
    health ,        
    Weapon
}

and a type of eCategory such as :-

eCategory currentcategory;

then currentcategory is of value type

Eklavyaa
  • 370
  • 5
  • 17
3
public enum TestReferenceOrValue
{
    one, two, three    
}
var a = TestReferenceOrValue.one;
var b = a;
b = TestReferenceOrValue.three;

If enums are by reference, changing b affects a
Console.Write(a); → one
Console.Write(b); → three

a great online tool for cSharp => http://csharppad.com/

SAm
  • 2,154
  • 28
  • 28
  • I downvoted for your display of erroneous programming conventions. Enum fields should start with an uppercase letter. – Krythic Oct 19 '16 at 02:35
  • 11
    The above code sample is unhelpful since it would act the same **regardless of whether `TestReferenceOrValue` was a reference type or value type**. `var a = "a"; var b = a; b = "b"; Console.Write(a); Console.Write(b);` shows that strings (and every type) act that way - and `string` is a reference type. That is because you are *overwriting* the b variable, not *altering* the object to which it points. – mjwills Nov 16 '17 at 05:16