.Net Tips – marking the default enum value ‘Undefined’

enum is a tremendously useful structure in C#, but when defining a new enum there is one thing you should always ask yourself:

What should the default value be for my enum?

The problem with default value is that enum is really an int underneath, and as do all integers in C# an enum has a default value of 0 when first created. So if 0 is not mapped to an enumeration constant then your enum will be instantiated with an invalid valid:

public enum MyColour
{
    Red = 1,
    Green = 2,
    Blue = 3
}

MyColour colour = new MyColour(); // colour = 0, which is not a valid MyColour enumeration

Alternatively, if you don’t specify the integer values for the enumerations the enumeration by default will start at 0, and a new enum will be instantiated with the first value in the list. Again, there’s the problem with the default value because most of the time there is no obvious candidates for the default value and it doesn’t make sense to just pick an arbitrary enumeration to be the default value:

public enum MyColour
{
    Red,    // 0
    Green, // 1
    Blue    // 2
}

MyColour colour = new MyColour(); // colour = MyColour.Red, but should a new colour default to red??

This can lead to subtle bugs, and are often hard to pick up on. Take for example a class that uses the MyColour enum, if the programmer who wrote the class forget to set the value of the enum it’ll simply read MyColour.Red, which is a valid case and without tracing through the code it’s difficult to know whether the enum had been set to MyColour.Red purposefully.

Therefore it’s always better to mark the default value of an enum with some special enumeration such as None, or Undefined, etc.:

public enum MyColour
{
    Undefined = 0,
    Red = 1,
    Green = 2,
    Blue = 3
}


Yan Cui

I’m an AWS Serverless Hero and the author of Production-Ready Serverless. I have run production workload at scale in AWS for nearly 10 years and I have been an architect or principal engineer with a variety of industries ranging from banking, e-commerce, sports streaming to mobile gaming. I currently work as an independent consultant focused on AWS and serverless.

You can contact me via Email, Twitter and LinkedIn.

Hire me.