2017-10-19 62 views
1

我在写一些通用的枚举铸造逻辑,和我遇到一个奇怪的现象附带Enum.ToObject方法:分配一个InvalidValue以枚举变量(这是为什么不抛出异常?)

[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#是强类型语言,这是一个强烈的定义枚举...

+0

不,它不会像这样工作。 'Enum'是它的基础类型。 –

+0

复制粘贴代码,你会看到它失败。问题是“为什么这不会抛出异常” –

+0

[Define“fail”。](https://dotnetfiddle.net/Xt38n6)你的意思是它得到了断言? –

回答

6

根据ISO IEC 23270(2006):

尤其的任何值枚举的基础类型可以将 转换为枚举类型,并且是该枚举类型的明确有效值。

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

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

注意System.Enum本身不是一个枚举类型。相反,它是一个 类型,从中派生所有的枚举类型。从类型类型System.Enum 继承System.ValueType(§11.1.1),这反过来,从类型object

如果你想检查是否枚举的价值是“共同”感觉有效,可以 继承使用Enum.IsDefined方法。

+0

啊,所以事实上,一个枚举的默认数据类型是一个int,基于继承,它必须遵循父类的要求。这就说得通了。感谢澄清“它不这样工作”这是更具建设性 –

+0

@NathanTregillus不,枚举不从int继承。我会在一秒钟内更新我的答案。 –