我正在编写一些通用的枚举转换逻辑,我用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#是一种强类型语言,这是一个强烈定义的枚举...
答案 0 :(得分:7)
根据ISO IEC 23270(2006):
特别是,可以强制转换枚举的基础类型的任何值 到枚举类型,并且是该枚举类型的唯一有效值。
枚举不会从基础类型“继承”(它只是一种语法)。根据相同的ISO,枚举隐式继承自System.Enum
和System.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
方法。