用户选择Enum范围之外的值的问题

时间:2015-11-11 22:05:53

标签: c# enums

我希望用户能够输入一个选项,让程序与enum选项之一匹配。我将其设置为循环,以便用户可以继续尝试,如果他们的条目不匹配(即AppleBananaCarrots)。

enum Food {Apple, Banana, Carrot};

Food foodChoice;
while (!(Enum.TryParse<Food>(Console.ReadLine(), true, out foodChoice)))
{
    Console.WriteLine("Not a valid choice.");
}

这一切都很好用,直到用户输入,比如说5。显然,Food枚举没有那么多选项,而TryParse仍然会输出true,将foodChoice分配给5.是否有一种简单的方法可以解决这个问题?< / p>

4 个答案:

答案 0 :(得分:7)

尝试使用Enum.IsDefined方法:

Food foodChoice;
while (!Enum.TryParse(Console.ReadLine(), true, out foodChoice)
    || !Enum.IsDefined(typeof(Food), foodChoice))
{
    Console.WriteLine("Not a valid choice.");
}

答案 1 :(得分:4)

根据MSDN关于TryParse的这种特殊(有点奇怪)的行为:

  

请注意,此值不必是TEnum枚举的成员。 ...如果value是不表示TEnum枚举的基础值的整数的字符串表示形式,则该方法返回一个枚举成员,其基础值的值转换为整数类型。如果不希望出现这种情况,请调用IsDefined方法以确保整数的特定字符串表示形式实际上是TEnum的成员。

所以你需要做的就是除了解析字符串值之外,通过调用IsDefined来检查值是否实际存在:

!Enum.IsDefined(typeof(Food), foodChoice)

现在为为什么?整数始终被视为有效的枚举值。它不会检查实际值,因为它需要计算每个可能的枚举值组合。这是真的,因为这是一个有效的枚举值:

Food foodChoice = Food.Carrot|Food.Apple|Food.Banana;

在这种情况下,只有几个可能的值,值为5是不可能的。对于更长的枚举,计算可能会变得非常大。这就是他们在解析步骤中省略它的原因。

答案 2 :(得分:0)

检查出来:

    var x = Enum.GetValues(typeof(Food));
    var a = Enum.IsDefined(typeof(Food), "Apple");
    var b = Enum.IsDefined(typeof(Food), "2");
    var c = Enum.IsDefined(typeof(Food), 2);
    var d = Enum.IsDefined(typeof(Food), 4);
    var e = Enum.GetNames(typeof(Food)).Contains("Apple");
    var f = Enum.GetNames(typeof(Food)).Contains("2");
    //var f = Enum.GetNames(typeof(Food)).Contains(2); //won't compile...

答案 3 :(得分:-1)

一种方法是查看字符串是否包含整数。

Food foodChoice;
int n;
string temp;
while (!(Enum.TryParse<Food>(temp = Console.ReadLine(), true, out foodChoice)) || int.TryParse(temp,out n))
{
    Console.WriteLine("Not a valid choice.");
}