8

出於好奇。帶動態參數的整體式預期開關值

如果我有以下代碼

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

我得到的誤差「A開關表達或case標籤必須是一個布爾,焦炭,串,積分,enum或相應空類型」

但如果我有以下代碼

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

一切編譯罰款。如果交換機正在檢查類型爲string和ToString()的變量,那麼它有什麼區別?還是因爲在調用ToString()之前拋出異常的機會?

回答

11

我相信問題是您的exception變量是一個dynamic對象。由於它是動態的,因此它的類型在編譯時不會解析,也不會在其上調用任何方法的類型。

因此,第一種情況下的switch語句不知道.GetType()方法將返回什麼類型,或.ToString()方法。如果你想它的工作,你可以施放它,就像這樣:

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

在你的代碼的第二塊,您明確指出的exception.GetType().ToString()結果將是一個字符串。在這種情況下,編譯器知道傳遞給switch語句的變量的類型。

就異常而言:編譯器不關心你的方法調用是否可能拋出異常。如果是這樣,異常將從switch語句中冒出來並從您的方法調用中拋出。

看看您的Format函數的內容,如果您通過exception作爲object,您可以實現相同的功能。如果您正在使用此功能來格式化Exceptions,則最好使用Exception作爲exception參數的類型。

2

我發現這個問題後,我重構的方法,發現了同樣的錯誤,

加入到由Jon Senchya提供的答案,我有開關的值從像下面

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."); 
    } 
方法返回

,因爲有一個在ConvertAction方法拋出異常的開關也不會執行, 這是通過使action解決hardtyped錯誤得到解決:

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

我猜你的問題來自'Utilities.ConvertAction'不是返回'GridActions',而是一些其他類型。 'var'是強類型的;它只是從作業中推斷出它的類型。 –