Enum.IsDefined 为字符串返回 false



我对字符串使用了Enum.IsDefined()方法,但在我认为应该得到True的情况下,我得到了False。请检查以下代码:

public enum YourEnum : int
{
Zero = 0,
One = 1
}
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1));
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1.ToString()));
}
} 

C# 小提琴演示
结果:

True
False

我不知道为什么在第二种情况下我应该得到False。任何帮助,不胜感激。

当您将字符串传递给IsDefined()方法时,您会询问枚举中是否存在具有该名称的值。文档内容如下:

value 参数可以是以下任何参数:
• 枚举类型的任何成员。
• 一个变量,其值是 enumType 类型的枚举成员。
枚举成员名称的字符串表示形式。字符串中的字符必须与枚举成员名称的大小写相同。
• 枚举类型的基础类型的值。

(强调我的)

读起来有点混乱,因为上面的第一个、第二个和第四个选项都会导致相同的结果:传递枚举类型的值(当然是装箱的)。

但第三个选项是你的方案正在发生的情况,字符串需要与枚举成员的名称匹配。您正在传递字符串"1",枚举中唯一有效的名称是"Zero""One"。字符串"1"与其中任何一个都不匹配,因此IsDefined()返回false

如果将字符串作为参数传递,它将查看枚举的名称之一是否等于指定的字符串。下面将返回两者的 true:

Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1));
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), "Zero"));

有关详细信息,请参阅源代码(第 1503 行)。话虽如此,最好从文档中推断出这些信息,正如 Duniho 的答案所示@Peter因为实现可以更改:但不是这样,如果您好奇,源代码就在那里。

最新更新