2

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

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

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

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

4

4 回答 4

6

通常,使用尽可能通用的解决方案是一个好主意。

DemoEnum.TryParse("input", out value)

与调用相同(您只是从继承的类而不是基类进行静态调用):

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

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

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

于 2012-04-30T13:42:00.023 回答
1

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

于 2012-05-01T01:56:50.543 回答
0

看起来 Resharper建议您使用 Enum.TryParse - http://msdn.microsoft.com/en-us/library/dd783499.aspx

我敢打赌,如果您查看 IL... DemoEnum.TryParse 只是在做一个 base.TryParse

于 2012-04-30T13:42:10.507 回答
-1

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

于 2012-04-30T13:49:35.413 回答