我正在写一些通用的枚举转换逻辑,我遇到了一个奇怪的现象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#是一种强类型语言,这是一个强烈定义的枚举...
根据ISO IEC 23270(2006):
特别是,枚举的基础类型的任何值都可以强制转换为枚举类型,并且是该枚举类型的唯一有效值.
枚举不会从基础类型"继承"(它只是一种语法).根据相同的ISO,枚举隐式继承自System.Enum和System.ValueType.
类型
System.Enum是所有枚举类型的抽象基类(这与枚举类型的基础类型不同且不同)请注意,
System.Enum它本身不是枚举类型.相反,它是一个类类型,从中派生所有枚举类型.类型System.Enum继承自类型System.ValueType(第11.1.1节),而类型继承自类型object
如果要检查枚举值是否在"常见"意义上有效,可以使用Enum.IsDefined方法.
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |