转换为无效的枚举值Enum.ToObject不会抛出异常,将Enum设置为int

时间:2014-12-09 18:58:25

标签: c# .net casting enums linqpad

这是正常行为吗?

编写枚举

1)尝试文本解析 2)回退到int解析。

int解析永远不会抛出错误......

尝试在LinqPad中运行以下脚本,我还没有测试过linqpad以外的其他编译器,但我怀疑它是否是Linqpad问题。

如果int匹配失败,怎么能抛出错误?

void Main()
{
    FieldAttributes fieldattributeenum = FieldAttributes.Assembly;
    B b = B.Valx1;      
    b.Dump("B = "+((int)b).ToString()); //Valx1 (11);

    fieldattributeenum.Dump("fieldattributeenum = " +((int)fieldattributeenum).ToString()); //Assembly (3)

    b = (B) Enum.ToObject(typeof(B), (int) fieldattributeenum); 
    b.Dump("B = "+((int)b).ToString()); //valcorrect3 (3)
    A a = (A) Enum.ToObject(typeof(A), (int) fieldattributeenum); //
    a.Dump("A = "+ ((int)a).ToString()); // ??? (3) 
}

public enum B{  
    Valx1=11,
    Valx2=12,
    Valx3=13,
    Valx4=14,
    valcorrect3 = 3
}
public enum A{  
    Valx1=11,
    Valx2=12,
    Valx3=13,
    Valx4=14,
    valcorrect3
}

2 个答案:

答案 0 :(得分:3)

只需使用Enum.IsDefined即可。基本上枚举只是整数,你可以将任何int分配给枚举,即使它没有被定义。

if(!Enum.IsDefined(typeof(A), a))
{
    throw new InvalidCastException("Not a valid value for A: " + a);
}

答案 1 :(得分:1)

来自MSDN Enum.ToObject Method (Type, Int32)

  

ToObject(Type,Int32)方法将value转换为枚举   基础价值为值的成员。请注意转换   即使值超出enumType成员的范围,也会成功。至   确保该值是enumType的有效基础值   枚举,将其传递给IsDefined方法。

所以它是设计的。