我希望用户能够输入一个选项,让程序与enum
选项之一匹配。我将其设置为循环,以便用户可以继续尝试,如果他们的条目不匹配(即Apple
,Banana
,Carrots
)。
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>
答案 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.");
}