分配一个InvalidValue以枚举变量(这是为什么不抛出异常?)
我在写一些通用的枚举铸造逻辑,和我遇到一个奇怪的现象附带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#是强类型语言,这是一个强烈的定义枚举...
根据ISO IEC 23270(2006):
尤其的任何值枚举的基础类型可以将 转换为枚举类型,并且是该枚举类型的明确有效值。
枚举不从基础类型“继承”(它只是一种语法)。根据相同的ISO,枚举隐含地从System.Enum
和System.ValueType
继承。
类型
System.Enum
是抽象基类所有枚举类型(这是不同的,并从基础类型的枚举 类型的不同)注意
System.Enum
本身不是一个枚举类型。相反,它是一个 类型,从中派生所有的枚举类型。从类型类型System.Enum
继承System.ValueType
(§11.1.1),这反过来,从类型object
如果你想检查是否枚举的价值是“共同”感觉有效,可以 继承使用Enum.IsDefined
方法。
啊,所以事实上,一个枚举的默认数据类型是一个int,基于继承,它必须遵循父类的要求。这就说得通了。感谢澄清“它不这样工作”这是更具建设性 –
@NathanTregillus不,枚举不从int继承。我会在一秒钟内更新我的答案。 –
不,它不会像这样工作。 'Enum'是它的基础类型。 –
复制粘贴代码,你会看到它失败。问题是“为什么这不会抛出异常” –
[Define“fail”。](https://dotnetfiddle.net/Xt38n6)你的意思是它得到了断言? –