枚举.TryParse奇怪的行为

本文关键字:TryParse 枚举 | 更新日期: 2023-09-27 18:17:51

为什么这个测试通过了?TestEnum不包含值为"5"的选项。所以这个测试应该失败,但它没有。

        private enum TestEnum
        {
            FirstOption = 2,
            SecontOption = 3
        }
        [Test]
        public void EnumTryParseIntValue()
        {
            TestEnum enumValue;
            bool result = Enum.TryParse<TestEnum>(5.ToString(), out enumValue);
            Assert.IsTrue(result);
        }

枚举.TryParse奇怪的行为

Enum。TryParse方法(String, TEnum)

If value是一个不对应于的命名常量的名称则该方法返回false。如果值是字符串表示形式不表示TEnum的基础值的整数枚举时,该方法返回一个枚举成员,其基础Value是转换为整型的值。如果这种行为是不希望的,调用IsDefined方法来确保特定的整数的字符串表示形式实际上是TEnum的成员。

"返回其基础值为转换为整型的值的枚举成员"
如果该值不存在,则返回整数。我不认为返回5是一个"枚举成员",但这就是它的工作方式。如果你解析2,你得到FirstOption。

if (Enum.IsDefined(typeof(TestEnum), 5.ToString()))
{
    result = Enum.TryParse<TestEnum>(5.ToString(), out enumValue);
    Debug.WriteLine(result);
    if (result)
    {
        Debug.WriteLine(enumValue.ToString());
    }
}

使用Enum。IsDefined(Type enumType,Object value) -返回一个具有指定值的常量是否存在于指定的枚举中。

MSDN:枚举。IsDefined方法