When writing a switch statement, there appears to be two limitations on what you can switch on in case statements.
For example (and yes, I know, if you’re doing this sort of thing it probably means your object-oriented (OO) architecture is iffy – this is just a contrived example!),
Type t = typeof(int); switch (t) { case typeof(int): Console.WriteLine('int!'); break; case typeof(string): Console.WriteLine('string!'); break; default: Console.WriteLine('unknown!'); break; }
Here the switch() statement fails with ‘A value of an integral type expected’ and the case statements fail with ‘A constant value is expected’.
Why are these restrictions in place, and what is the underlying justification? I don’t see any reason why the switch statement has to succumb to static analysis only, and why the value being switched on has to be integral (that is, primitive). What is the justification?
This is my original post, which sparked some debate… because it is wrong:
In fact, the C# switch statement is not always a constant time branch.
In some cases the compiler will use a CIL switch statement which is indeed a constant time branch using a jump table. However, in sparse cases as pointed out by Ivan Hamilton the compiler may generate something else entirely.
This is actually quite easy to verify by writing various C# switch statements, some sparse, some dense, and looking at the resulting CIL with the ildasm.exe tool.