我有一个Enum的扩展方法:
public static List<Enum> Values(this Enum theEnum)
{
return Enum.GetValues(theEnum.GetType()).Cast<Enum>().ToList();
}
我违反了代码分析:
CA1062验证公共方法的论据
在外部可见 方法&#39; EnumExtensions.Values(此枚举)&#39;,验证参数 &#39; theEnum&#39;在使用之前。
为什么会这样?如何验证参数?我无法检查null,因为枚举是一个不可为空的值类型。是否有其他检查应该在这里发生?
答案 0 :(得分:5)
我无法检查null,因为枚举是一种不可为空的值类型。
任何特定的枚举都是值类型,但Enum
本身并不是。 (就像ValueType
不是值类型一样......从ValueType
派生的每个类型除了Enum
都是值类型。)
换句话说,我可以写:
Enum foo = null;
var bang = foo.GetValues();
那将编译然后在执行时使用NullReferenceException
失败。
鉴于您忽略了除了获取其类型之外的值,我实际建议删除它并 接受Type
或制作它你想要的枚举类型的泛型。但是如果你想保留当前的签名,你只需要:
if (theEnum == null)
{
throw new ArgumentNullException();
}
您可能还想查看我的Unconstrained Melody项目,它为枚举提供了一堆辅助方法,通过IL操作通常限制为枚举类型。
答案 1 :(得分:0)
enum关键字用于声明枚举,这是一个由称为枚举器列表的一组命名常量组成的不同类型。
它仅用于声明另一个枚举。在任何情况下,输入都应该是您的声明。
public enum theEnum {
enum1,
enum2
}
public void ShowEnum(theEnum e)
{
System.Console.WriteLine(e.GetType());
}