枚举TryParse与基类限定符

时间:2012-04-30 13:39:35

标签: c# resharper

我有一个枚举(让我们说DemoEnum),我想解析这个枚举的值。我在写

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

现在,resharper建议我使用基类限定符。

我只是想知道使用基类限定符有什么好处?

4 个答案:

答案 0 :(得分:5)

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

DemoEnum.TryParse("input", out value)

是同一个调用(你只是从一个继承的类而不是基类进行静态调用):

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

使用基类限定符(Enum)而不是特定的枚举(DemoEnum)可以使您免受将来更改DemoEnum的可能副作用。实际情况是,如果您在不更改名称的情况下将DemoEnum更改为类,那么您真的只会遇到问题。

使用类时,这通常是一个更大的问题(ReSharper将在这些情况下提供相同的指导)。

答案 1 :(得分:1)

TryParse()方法是Enum类中定义的静态方法。由于你的枚举继承了Enum类的所有内容,因此它也“继承”了静态成员。它不是真正的继承,静态成员只能从类中看到。

其他答案是错误的,因为正在为您完成一些特殊的翻译。您所做的只是从派生类访问静态成员,因为所有静态成员都可以通过枚举访问。您正在访问静态方法的标识符的类型在通用参数上没有承载 ,只有编译器能够从它们推断的内容(或您明确提供)。< / p>

为了说明我的观点,请考虑以下两个枚举:

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会先发制人地警告您应该使用定义它的实际类(基数)。

答案 2 :(得分:0)

看起来Resharper 暗示你使用了Enum.TryParse - http://msdn.microsoft.com/en-us/library/dd783499.aspx

我敢打赌如果你看看IL ... DemoEnum.TryParse正在做一个base.TryParse

答案 3 :(得分:-1)

编写DemoEnum.TryParse时,编译器会将其转换为Enum.TryParse<DemoEnum>。没有功能差异,并且您实际上不需要与可能的副作用隔离,因为您无法在enum类型中定义方法,因此无法重新定义TryParse。我最好的猜测是它是一种风格偏好。