簡體   English   中英

具有基類限定符的Enum TryParse

[英]Enum TryParse with base class qualifier

我有一個枚舉(比如說DemoEnum),我想解析一個值給這個枚舉。 我正在寫

DemoEnum value;
if(DemoEnum.TryParse("input", out value))
{
   this.Value = value;
}

現在,resharper建議我使用基類限定符。

我只想知道使用基類限定符有什么好處?

通常,最好使用最通用的解決方案。

DemoEnum.TryParse("input", out value)

與(與您只是從繼承的類而不是基類進行靜態調用)相同:

Enum.TryParse<DemoEnum>("input", out value)

使用基類限定符( Enum )而不是特定的枚舉( DemoEnum )將使您免受將來更改DemoEnum可能副作用的影響。 現實情況是,如果將DemoEnum更改為類而不更改名稱,則實際上只會遇到問題。

使用類時,這通常是一個更大的問題(在這種情況下,ReSharper將提供相同的指導)。

TryParse()方法是Enum類中定義的靜態方法。 由於您的枚舉繼承自Enum類的所有內容,因此它也“繼承”了靜態成員。 這不是真正的繼承,靜態成員僅在類中可見。

其他答案是錯誤的,因為某些特殊翻譯正在為您完成。 因為您可以通過枚舉訪問所有靜態成員,所以您所做的就是從派生類訪問靜態成員。 您要從其訪問靜態方法的標識符的類型與通用參數的含義完全無關,而與編譯器能夠從中推斷出(或您明確提供的)參數完全無關。

為了說明我的觀點,請考慮以下兩個枚舉:

enum First { A, B }
enum Second { A, B }

First firstVar;
Second secondVar;
// note we're using the `First` name
First.TryParse("A", out firstVar);  // valid, firstVar <= First.A
First.TryParse("B", out secondVar); // still valid, secondVar <= Second.B

// is equivalent to
Enum.TryParse<First>("A", out firstVar); // generic type is inferred from type of firstVar
Enum.TryParse<Second>("B", out secondVar); // generic type is inferred from type of secondVar

ReSharper告訴您的是,您應該從實際定義了成員的類中訪問靜態成員。 為什么要這樣做?

考慮一下如果您的派生類型定義了一個具有相同確切名稱的靜態成員會發生什么。 (在這種情況下,枚舉是不可能的,但通常適用於類)那么代碼會發生什么? 通過派生類訪問靜態成員的任何代碼都將采用新值,並且您可能不會收到關於它的新警告。 這可能是預期的行為,也可能不是預期的行為,因此ReSharper會先行警告您應使用定義它的實際類(基類)。

看起來Resharper 建議您使用Enum.TryParse- http://msdn.microsoft.com/zh-CN/library/dd783499.aspx

我敢打賭,如果您看看IL ... DemoEnum.TryParse只是在做base.TryParse

當您編寫DemoEnum.TryParse ,編譯器DemoEnum.TryParse其轉換為Enum.TryParse<DemoEnum> 沒有功能上的區別,並且您真的不需要與可能的副作用隔離開來,因為您無法以enum類型定義方法,因此無法重新定義TryParse 我最好的猜測是它是一種樣式偏好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM