将invalidValue分配给Enum变量(为什么这不会引发异常?)

时间:2017-10-19 18:46:45

标签: 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
        }
    }
}

```

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

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

1 个答案:

答案 0 :(得分:7)

根据ISO IEC 23270(2006):

  

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

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

  

类型L = 10000; x = rand(4,L+1); A_k = rand(4,4,L); B_k = squeeze(sum(A_k,2)).'; tic for k = 2:L ii = 1:k-1; x(:,k+1) = x(:,k+1) + diag(x(:,ii)*B_k(k+1-ii,:)); end toc 是所有枚举类型的抽象基类(这与枚举的基础类型不同且不同)   型)

     

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

类型

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