列挙型 (DemoEnum としましょう) があり、この列挙型の値を解析したいと考えています。書いています
DemoEnum value;
if(DemoEnum.TryParse("input", out value))
{
this.Value = value;
}
リシャーパーは、基本クラス修飾子を使用することを提案しています。
基本クラス修飾子を使用する利点は何ですか?
一般に、可能な限り最も一般的なソリューションを使用することをお勧めします。
DemoEnum.TryParse("input", out value)
と同じ呼び出しです (基本クラスではなく、継承されたクラスから静的呼び出しを行っているだけです):
Enum.TryParse<DemoEnum>("input", out value)
Enum
特定の列挙型 ( ) の代わりに基底クラス修飾子 ( ) を使用すると、将来DemoEnum
の変更による副作用を回避できます。DemoEnum
現実には、名前を変更せずに DemoEnum をクラスに変更した場合にのみ、実際に問題が発生することになります。
これは通常、クラスを使用する場合のより大きな問題です (ReSharper は、これらの状況で同じガイダンスを提供します)。
メソッドは、クラスTryParse()
で定義された静的メソッドです。Enum
列挙型はEnum
クラスからすべてを継承するため、静的メンバーも「継承」します。これは真の継承ではなく、静的メンバーはクラスから見えるだけです。
他の答えは、あなたのために特別な翻訳が行われているという点で間違っています。すべての静的メンバーは列挙型を介してアクセスできるため、派生クラスから静的メンバーにアクセスするだけです。静的メソッドにアクセスしている識別子の型は、ジェネリック パラメーターが何であるかにはまったく関係がなく、コンパイラーがそれらから推測できるもの (または明示的に提供するもの) だけです。
私の要点を説明するために、次の 2 つの列挙型を考えてみましょう。
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/en-us/library/dd783499.aspx
IL を見ればきっと... DemoEnum.TryParse は base.TryParse を実行しているだけです
を記述するDemoEnum.TryParse
と、コンパイラはそれを に変換しEnum.TryParse<DemoEnum>
ます。enum
機能的な違いはなく、型でメソッドを定義できないため、再定義できないため、考えられる副作用から隔離する必要はありませんTryParse
。私の最善の推測は、それがスタイルの好みだということです。