Wert des erwarteten Integraltyps mit dynamischem Parameter wechseln

8

Nur aus Neugier.

Wenn ich den folgenden Code habe

%Vor%

Ich erhalte den Fehler "Ein Schalterausdruck oder eine Groß- / Kleinschreibung muss ein bool-, char-, string-, integral-, enum- oder entsprechender Nullwerttyp sein"

aber wenn ich den folgenden Code habe

%Vor%

alles kompiliert gut. Was ist der Unterschied, wenn der Switch eine Variable vom Typ String und ToString () überprüft? Oder liegt es an der Möglichkeit, eine Exception zu werfen, bevor ToString () aufgerufen wird?

    
Belial09 14.02.2014, 12:58
quelle

2 Antworten

11

Ich glaube, das Problem ist, dass Ihre exception Variable ein dynamic Objekt ist. Da es dynamisch ist, wird sein Typ zur Kompilierzeit nicht aufgelöst, noch werden die Typen irgendwelcher Methoden aufgerufen.

Als solche hat die switch-Anweisung im ersten Fall keine Ahnung, welchen Typ die Methode .GetType() zurückgibt oder die Methode .ToString() . Wenn Sie es zum Laufen bringen wollen, können Sie es wie folgt umsetzen:

%Vor%

In Ihrem zweiten Codeblock geben Sie explizit an, dass das Ergebnis von exception.GetType().ToString() eine Zeichenfolge sein wird. In diesem Fall kennt der Compiler den Typ der Variablen, die an die switch-Anweisung übergeben wird.

Was Ausnahmen betrifft: Dem Compiler ist es egal, ob der Methodenaufruf möglicherweise eine Ausnahme auslöst. Wenn dies der Fall ist, wird die Ausnahme aus der switch-Anweisung gesprungen und von Ihrem Methodenaufruf ausgelöst.

Wenn Sie den Inhalt Ihrer Funktion Format betrachten, können Sie die gleiche Funktionalität erreichen, wenn Sie in exception als object übergeben haben. Wenn Sie diese Funktion verwenden, um Exceptions speziell zu formatieren, verwenden Sie am besten Exception als Typ Ihres Parameters exception .

    
Jon Senchyna 14.02.2014, 13:02
quelle
2

Ich habe diese Frage gefunden, nachdem ich eine Methode umstrukturiert und den gleichen Fehler gefunden habe,

Hinzufügen zu der Antwort von Jon Senchya, hatte ich den Wert des Schalters von einer Methode wie folgt zurückgegeben

%Vor%

weil es in der ConvertAction -Methode eine throw-Ausnahme gibt, die der Schalter nicht ausführen würde, Das wurde gelöst, indem action hardtyped gemacht wurde, der Fehler wurde behoben:

%Vor%     
Ymnia 23.10.2014 09:29
quelle