2014-09-04 39 views
2

我使用ReSharper的,和我遇到了兩種情景生成switch語句時:ReSharper的抱怨它產生的switch語句 - 「無法解析符號......」

public void DoWork(MyEnum value) 
{ 
    switch(value) 
    { 
     // ... 

     default: 
      throw new ArgumentOutOfRangeException("value"); 
    } 
} 

public void DoWork() 
{ 
    var value = GetEnumValue(); 

    switch(value) 
    { 
     // ... 

     default: 
      // Cannot resolve symbol 'value' 
      throw new ArgumentOutOfRangeException("value"); 
    } 
} 

似乎如果我將枚舉值作爲參數傳入,ReSharper不會抱怨它生成的代碼。它認識到value適用於例外消息。但是,如果我在方法中以某種其他方式獲取值作爲局部變量,ReSharper似乎會抱怨它生成的代碼,聲稱「無法解析符號」值「」。這種說法是有道理的,因爲value是一個局部變量,所以捕獲異常消息的用戶不知道什麼是value

那麼,爲什麼會發生這種情況呢?

+2

爲什麼不使用自定義異常?如果你沒有任何爭論,那麼拋出一個ArgumentOutOfRange非常奇怪,違反直覺。 – 2014-09-04 15:54:11

+0

自定義異常通常沒有正確實現。例如,它們通常不能正確序列化或包含不可序列化類型的字段,當異常嘗試跨越AppDomain邊界時會導致問題。如果您*執行*自己的例外,我會建議遵循MSDN上的所有細節。 – vcsjones 2014-09-05 11:14:32

回答

4

According to MSDNparamName應該是一個參數的值:

導致該異常的參數的名稱。

所以你應該使用一個參數的名稱,而不是本地。即使Resharper生成它,但無法進行此更改,而無需進行重大更改,例如更改異常類型。

也許在這種情況下更好的例外是InvalidOperationException

5

問題是您使用的錯誤類型爲Exception。在第二個例子中,value不是一個參數,所以拋出一個ArgumentOutOfRangeException在語義上是錯誤的。我已經創建自定義Exception在這種情況下使用,歡迎您使用它爲您的用途,以及:

public class UnexpectedEnumException : Exception 
{ 
    public UnexpectedEnumException(Type enumType, object unexpectedValue) 
     : base(string.Concat("Unexpected ", enumType.Name, ": ", unexpectedValue)) 
    { 
    } 

    public static UnexpectedEnumException Create<TEnum>(TEnum unexpectedValue) where TEnum : struct, IConvertible, IFormattable, IComparable 
    { 
     return new UnexpectedEnumException(typeof (TEnum), unexpectedValue); 
    } 
}