我有一个枚举(让我们说DemoEnum),我想解析这个枚举的值。我在写
DemoEnum value;
if(DemoEnum.TryParse("input", out value))
{
this.Value = value;
}
现在,resharper建议我使用基类限定符。
我只是想知道使用基类限定符有什么好处?
答案 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
。我最好的猜测是它是一种风格偏好。