68

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?

4 Answers 4

111

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?.

Sign up to request clarification or add additional context in comments.

3 Comments

Worth noting that Foo? is sugar for System.Nullable<Foo> and that Nullable is also a value type.
Is this the same scenario with Swift?
@TechPedia: in general, asking a question in a comment about a very different language/platform from the original question is unlikely to be helpful. A Google search of "are swift enums reference types or value types" suggests an answer pretty quickly though.
18

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

Comments

6

suppose we have enum

public enum eCategory
{
    health ,        
    Weapon
}

and a type of eCategory such as :-

eCategory currentcategory;

then currentcategory is of value type

Comments

2
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/

2 Comments

I downvoted for your display of erroneous programming conventions. Enum fields should start with an uppercase letter.
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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.