将invalidValue分配给Enum变量(为什么不抛出异常?)

Nat*_*lus 2 c# enums casting

我正在写一些通用的枚举转换逻辑,我遇到了一个奇怪的现象Enum.ToObject:

[TestClass]
public class UnitTest1
{
    public enum FixedSet
    {
        Value1 = 1,
        Value2 = 2,
        Value3 = 3

    }

    [TestMethod]
    public void TestMethod1()
    {

        try
        {
            var intVal = 123;
            FixedSet actual = (FixedSet)Enum.ToObject(typeof(FixedSet), intVal);
            Assert.Fail("Thought an exception should have occured");
        }catch(Exception e)
        {
            //should have thrown an exception
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

```

我希望这会抛出某种异常,因为123不是给定枚举类型的值,但是,我能够将它设置为此FixedSet变量的值.

为什么允许这样做?我总是认为这应该失败,因为C#是一种强类型语言,这是一个强烈定义的枚举...

Ser*_*nov 7

根据ISO IEC 23270(2006):

特别是,枚举的基础类型的任何值都可以强制转换为枚举类型,并且是该枚举类型的唯一有效值.

枚举不会从基础类型"继承"(它只是一种语法).根据相同的ISO,枚举隐式继承自System.EnumSystem.ValueType.

类型System.Enum是所有枚举类型的抽象基类(这与枚举类型的基础类型不同且不同)

请注意,System.Enum它本身不是枚举类型.相反,它是一个类类型,从中派生所有枚举类型.类型System.Enum 继承自类型System.ValueType(第11.1.1节),而类型继承自类型object

如果要检查枚举值是否在"常见"意义上有效,可以使用Enum.IsDefined方法.