Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

is there a warning (error), similar to C4061 for C#

Usually, if I use switch for enums in C#, I have to write something like that:

switch (e)
{
    case E.Value1:
        //...
        break;

    case E.Value2:
        //...
        break;

        //...
    default:
        throw new NotImplementedException("...");
}

In C++ (for VS) I could enable warnings C4061 and C4062 for this switch, make them errors and have a compile-time check. In C# I have to move this check to runtime...

Does anyone know how in C# I can have this checked in compile time? Maybe there is a warning, disabled by default, which I missed, or some other way?

like image 439
Alek86 Avatar asked Sep 21 '12 13:09

Alek86


2 Answers

No, there isn't be a compile-time check - it's legitimate to have a switch/case which only handles some of the named values. It would have been possible to include it, but there are some issues.

Firstly, it's entirely valid (unfortunately) for an enum value not to have any of the "named" values:

enum Foo
{
    Bar = 0,
    Baz = 1
}
...
Foo nastyValue = (Foo) 50;

Given that any value is feasible within the switch/case, the compiler can't know that you didn't mean to try to handle an unnamed value.

Secondly, it wouldn't work well with Flags enums - the compiler doesn't really know which values are meant to be convenient combinations. It could infer that, but it would be a bit icky.

Thirdly, it's not always what you want - sometimes you really do only want to respond to a few cases. I wouldn't want to have to suppress warnings on a reasonably regular basis.

You can use Enum.IsDefined to check for this up front, but that's relatively inefficient.

I agree that all of this is a bit of a pain - enums are a bit of a nasty area when it comes to .NET :(

like image 180
Jon Skeet Avatar answered Sep 20 '22 02:09

Jon Skeet


I understand that this is necroposting, but nothing really changed in this area inside of the compiler. So, I made Roslyn analyzer for switch statements. You can download SwitchAnalyzer package. This is Roslyn analyzer and it supports

  • Enums with operations | and & for them. So, you can check flags as well (but not like single int value)

  • Interface implementations (pattern matching) in the current data context.

Pattern matching for classes is not implemented in version 0.4 yet (but I hope to implement it soon). To use it, just add this package to your project, you will get warnings for all uncovered cases if you don't have default branch or if it throws exception. And of course, you can enable "Treat warnings as errors" option for your project for all or specific warnings. Feel free to contact me in case if you will find any bugs.

like image 39
Denys Prodan Avatar answered Sep 21 '22 02:09

Denys Prodan