8

Nur aus Neugier.Wert des Integraltyps erwartet Schalter mit dynamischem Parameter

Wenn ich den folgenden Code

public static string Format(dynamic exception) 
{ 
    switch (exception.GetType().ToString()) 
    { 
     case "test": 
      return "Test2"; 
    } 
    return null; 
} 

erhalte ich die Fehler "Ein Schalter Ausdruck oder Fall Etikett muss ein Bool, char, string, integral, Enum sein, oder entsprechende Nullable Type"

aber wenn ich den folgenden Code

haben
public static string Format(dynamic exception) 
{ 
    string test = exception.GetType().ToString(); 
    switch (test) 
    { 
     case "test": 
      return "Test2"; 
    } 
    return null; 
} 

alles kompiliert in Ordnung. 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?

Antwort

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 von Methoden aufgerufen.

Als solche hat die switch-Anweisung im ersten Fall keine Ahnung, welchen Typ die .GetType()-Methode zurückgibt, oder die .ToString()-Methode. Wenn Sie es Arbeit machen möchten, können Sie es werfen könnte, etwa so:

switch (exception.GetType().ToString() as string) 

In Ihrem zweiten Codeblock werden die besagt, Sie ausdrücklich, dass das Ergebnis der exception.GetType().ToString() wird ein String sein. In diesem Fall kennt der Compiler den Typ der Variablen, die an die switch-Anweisung übergeben wird.

Soweit Ausnahmen gehen: Der Compiler kümmert sich nicht, wenn Ihr Methodenaufruf möglicherweise eine Ausnahme auslösen könnte. Wenn dies der Fall ist, wird die Ausnahme aus der switch-Anweisung herausgeblasen und von Ihrem Methodenaufruf ausgelöst.

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

2

ich diese Frage gefunden, nachdem ich eine Methode Refactoring und die gleichen Fehler gefunden,

auf die Antwort Hinzufügen von Jon Senchya zur Verfügung gestellt, hatte ich den Wert des Schalters von einer Methode, wie die folgenden

zurück
var action = Utilities.ConvertAction(x.action); 
    switch (action) 
    { 
      case GridActions.ADD: 
       MethodX(); 
       break; 
      case GridActions.UPDATE: 
       MethodX(); 
       break; 
      case GridActions.DELETE: 
       MethodX(); 
       break; 
      default: throw new WebException("Invalid action."); 
    } 

, weil es eine throw Ausnahme ist in der ConvertAction Methode der Schalter nicht durchführen würde, dies wurde durch action Herstellung gelöst hardtyped der Fehler behoben wurde:

GridActions action = Utilities.ConvertAction(x.action); 
    switch (action) 
    { 
      case GridActions.ADD: 
       MethodX(); 
       break; 
      case GridActions.UPDATE: 
       MethodX(); 
       break; 
      case GridActions.DELETE: 
       MethodX(); 
       break; 
      default: throw new WebException("Invalid action."); 
    } 
+0

Ich vermute, Ihr Problem stammt aus 'Utilities.ConvertAction' nicht eine' GridActions', sondern eine andere Art zurück. 'var' ist stark typisiert; es leitet seinen Typ nur von der Zuweisung ab. –