2012-09-21 3 views
7

Normalerweise, wenn ich für Aufzählungen in C# Schalter verwenden, habe ich so etwas schreiben:gibt es eine Warnung (Fehler), ähnlich wie C4061 für C#

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

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

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

In C++ (für VS) konnte ich Aktivieren Sie die Warnungen C4061 und C4062 für diesen Schalter, machen Sie Fehler und überprüfen Sie die Kompilierung. In C# muss ich diese Prüfung zur Laufzeit verschieben ...

Weiß jemand wie in C# kann ich dies in Kompilierzeit überprüft haben? Vielleicht gibt es eine Warnung, standardmäßig deaktiviert, die ich vermisst habe, oder auf andere Weise?

+2

kommt erklären Sie bitte die Warnungen für diejenigen, die nicht mit den C++ CXYZ-Warnungen –

+0

sie sind in msdn ziemlich gut erklärt.In wenigen Worten, in C++ - Code, wenn Sie sie aktivieren, verwenden Sie "switch" für einige Aufzählung und vergessen, einige der Enumerationswerte (in separaten "Fall") zu verarbeiten, die Sie erhalten eine Warnung während der Kompilierung – Alek86

Antwort

5

Nein, es gibt keine Kompilierzeitprüfung - es ist legitim, einen Schalter/Fall zu haben, der nur einige der benannten Werte behandelt. Es wäre möglich gewesen, es einzuschließen, aber es gibt einige Probleme.

Erstens ist es durchaus gültig ist (leider) für einen ENUM-Wert nicht der „Namen“ Werte haben:

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

Da jeder Wert ist möglich innerhalb des Schalters/Fall der Compiler Ich kann nicht wissen, dass du nicht mit einem unbenannten Wert umgehen wolltest.

Zweitens würde es nicht gut mit Flags Enums funktionieren - der Compiler weiß nicht wirklich, welche Werte als bequeme Kombinationen gemeint sind. Es könnte daraus schließen, aber es wäre ein bisschen eklig.

Drittens ist es nicht immer was Sie wollen - manchmal wollen Sie wirklich nur auf ein paar Fälle reagieren. Ich möchte die Warnungen nicht regelmäßig genug unterdrücken müssen.

Sie können Enum.IsDefined verwenden, um dies im Voraus zu überprüfen, aber das ist relativ ineffizient.

Ich bin damit einverstanden, dass dies alles ist ein bisschen wie ein Schmerz - Aufzählungen sind ein bisschen von einem fiesen Bereich, wenn es um .NET :(

+2

danke, aber ich stimme nicht mit "Nein, es kann keine Compile-Time-Prüfung geben." In C++ können Sie einen beliebigen Wert auf Enum zu setzen, aber es gibt eine Möglichkeit zu überprüfen, dass Sie verarbeiten alle erwarteten Werte – Alek86

+0

@ Alek86: Okay, werde um diese. –

+0

vielleicht Sie wissen, ein mit einem Drittanbieter-Tool (wie StyleCop), das kann das überprüfen? – Alek86