2013-02-25 31 views
0

我的代碼中有這樣的內容。現在該方法假設返回一個枚舉類型。 但是並不是所有的代碼路徑都返回一個值。我想解決這個問題,同時我希望調試器提醒我(即)聲明如果進入else(代碼中的第三個條件),則不會返回枚舉類型。通常我會爲else條件添加另一個枚舉類型並檢查返回的值,但我想知道是否有更好的方法來完成此操作。如何爲返回類型的特定條件添加斷言

 private enumType AdjustType(someo_object q) 
     { 
      if(q.val.Equals("M")) 
      { 
       return enumType.FirstType; 
      } 
      else if (q.val.Equals("N")) 
      { 
       return enumType.SecondType; 
      } 
      else 
      { 
       return null; //This isnt allowed - I would like something like an assertion here 
      } 
     } 

回答

2

您有幾種選擇:

  1. 拋出一個異常。如果知道輸入爲無效(例如,由於調用代碼中存在錯誤),這是適當的。

    throw new InvalidOperationException("Cannot convert from Q to MyEnum."); 
    
  2. 使用可爲空的類型。如果操作沒有有效的結果(例如,由於用戶輸入無效或不是錯誤的情況),這是適當的。

    private MyEnum? AdjustType(object q) 
    { 
        // ... 
        else 
         return null; 
    } 
    
  3. 一個None值添加到枚舉並返回:

    public enum MyEnum 
    { 
        None = 0, 
        First, 
        Second 
    } 
    

(請注意,它總是建議添加這樣一個價值,可以讀here


如果傳入參數的值對您的方法永遠無效,那麼您應該在方法開始時檢查那些值,並在值無效時拋出ArgumentException或其派生類之一。然後你可以假設你的方法的其餘部分傳入的值是有效的,這使得你的代碼更加清晰。這是我喜歡這種方法的程序:

private MyEnum AdjustType(object q) 
{ 
    #region Contract 
    if (q == null) 
     throw new ArgumentNullException("q"); 
    if (q.Value != "M" && q.Value != "N") 
     throw new ArgumentException("Value must be M or N.", "q"); 
    #endregion 

    // Here all incoming arguments are valid and within range. 
    // ... 
} 
1

你總是可以使用枚舉的可空版本:

private enumType? AdjustType(someo_object q) 
+0

或者使用F#選項類型:http://langexplr.blogspot.com/2008/06/using-f-option-types-in-c.html – rkrahl 2013-02-25 20:20:22

2

我只想扔ArgumentException - 可能通過一個開關做到這一點:

private enumType AdjustType(someo_object q) 
{ 
    switch (q.val) 
    { 
     case "M": return enumType.FirstType; 
     case "N": return enumType.SecondType; 
     default : throw new ArgumentException(...); 
    } 
} 

我個人比較喜歡這使用Debug.Assert - 在那裏你不得不返回東西反正,然後錯誤可能會傳播時,爲在發佈版本中關閉分區。

另一種選擇是隻需要一個Dictionary<string, enumType> - 您可能會很高興讓KeyNotFoundException傳播。 (這取決於你的背景。)

+0

鑑於字典建議,你可能會去完整的豬,只是使枚舉一個Char的枚舉,然後解析這個壞男孩enumType。 :) – Aron 2013-02-25 20:46:05

相關問題