Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why switch for enum accepts implicit conversion to 0 but no for any other integer?

There is an:

enum SomeEnum
{
    A = 0,
    B = 1,
    C = 2
}

Now compiler allows me to write:

SomeEnum x = SomeEnum.A;
switch(x)
{
    case 0: // <--- Considered SomeEnum.A
        break;
    case SomeEnum.B:
        break;
    case SomeEnum.C:
        break;
    default:
        break;
}

0 is considered SomeItems.A. But I can't write:

SomeEnum x = SomeEnum.A;
switch(x)
{
    case 0:
        break;
    case 1: // <--- Here is a compilation error.
        break;
    case SomeEnum.C:
        break;
    default:
        break;
}

Why only implicit conversion exists for 0?

like image 406
Ryszard Dżegan Avatar asked Feb 19 '13 05:02

Ryszard Dżegan


People also ask

Is there case 0 in switch statement?

An implicit enumeration conversion permits the decimal-integer-literal 0 to be converted to any enum-type. So 0 is special here in a way that no other integer literal is.

Are enums just integers?

No, we can have only strings as elements in an enumeration.

Can an enum have one value?

Description. An enumeration. A string object that can have only one value, chosen from the list of values 'value1', 'value2', ..., NULL or the special '' error value. In theory, an ENUM column can have a maximum of 65,535 distinct values; in practice, the real maximum depends on many factors.

Should enums be numbers?

Enums are always assigned numeric values when they are stored. The first value always takes the numeric value of 0, while the other values in the enum are incremented by 1.


2 Answers

From ECMA-334 (C# Language Specification)

13.1.3 Implicit enumeration conversions

An implicit enumeration conversion permits the decimal-integer-literal 0 to be converted to any enum-type.

enum's default value is 0 and at compile time it is known that is why it is allowed in the switch statement. For value other than 0, it can't be determine at compile time whether this value will exist in the enum or not.

enum (C# Reference)

Assigning additional values new versions of enums, or changing the values of the enum members in a new version, can cause problems for dependant source code. It is often the case that enum values are used in switch statements, and if additional elements have been added to the enum type, the test for default values can return true unexpectedly.

like image 137
Habib Avatar answered Oct 18 '22 21:10

Habib


I would also add, that the syntax with 0 instead of the exact enum in the switch statement may become error prone. Consider the following code:

enum TestEnum
{
    NA = 0,
    A
}

and then

var e = TestEnum.NA;
switch(e)
{
    case 0:
        {
            break;
        }
    case TestEnum.A:
        {
            break;
        }
}

This compiles and works well. However if for some reason, enum declaration changes to

enum TestEnum
{
    NA = 1,
    A
}

everything will get broken.

Though in the majority of situations the default value for enum is 0 and for that reason this syntax may take place, I would use the exact enum.

like image 24
horgh Avatar answered Oct 18 '22 21:10

horgh