下午好,假设我有枚举
public enum Test : int
{
TestValue1 = 0,
TestValue2,
TestValue3
}
为什么我不能使用Int32 IntTest = Test.TestValue1
这样的语句而不使用强制转换来表示IntTest = 0
?如果我稍后决定在枚举中添加更多项目会很有用吗?我想我被迫使用Int32 IntTest = (Int32) Test.TestValue1
,我认为这应该是多余的......另外,为什么我不能做像
switch (IntTest)
{
case (Test.TestValue1) : DoSomething();
break;
case (Test.TestValue2) : DoSomethingElse();
break;
default : Do Nothing();
}
?编译器说它期望在TestValue1
的位置有一个常量值...这个值是不是恒定不变?
非常感谢。
答案 0 :(得分:8)
请注意,您可以这样做:
switch ((Test)IntTest)
{
case (Test.TestValue1) : DoSomething();
break;
case (Test.TestValue2) : DoSomethingElse();
break;
default : DoNothing();
}
即使枚举中没有值,也保证不会失败。如果枚举中不存在该值,则在Test实例上调用ToString()将返回基础数值的字符串表示形式。
答案 1 :(得分:7)
您不能互换地使用Int32
和Test
,因为在语义上它们是不同的类型,即使它们碰巧使用相同的底层存储机制。
如果您需要Int32
,请使用Int32
;如果您需要Test
,请使用Test
;如果你需要在它们之间进行转换,那么使用显式转换。
(当然,这种语言可能很容易被隐含地允许这些转换,但是这样的“功能”可能会产生比它解决的问题更多的问题。)
答案 2 :(得分:2)
你必须施放,因为语言定义说你必须施放。冗余?也许。但就是这样。
对于switch
声明:
switch (IntTest)
{
case (int)Test.TestValue1: DoSomething(); break;
}
枚举值必须使用枚举类型的名称完全限定。
答案 3 :(得分:2)
我希望以与此相同的方式实现枚举,以简化使用表列名称作为字符串转换为索引的应用程序。
这就是我想要实现的目标:
enum TableName
{
Column1Name = 0
}
Column1Data = (cast)objData[RowIndex][TableName.Column1Name];
上面提到的问题是C#在使用enum的
时需要显式转换Column1Data = (cast)objData[RowIndex][(int)TableName.Column1Name]; //what a waste of time..
但是我有一个解决方法..你想要的只是呻吟:P(这不是一个生产应用程序 - 在现场环境中实现之前,请仔细考虑这段代码的影响)
public static class TableName
{
public const int Column1Name = 0;
}
Column1Data = (cast)objData[RowIndex][TableName.Column1Name]; //this is now valid, and my sanity remains intact - as does the integer value ;)
答案 4 :(得分:2)
public enum Test
{
TestValue1 = 0,
TestValue2,
TestValue3
}
在方法中,您可以将枚举用作类型 只需打开Test类型的变量,就不需要将枚举转换为int。
public void DoSwitch(Test val)
{
switch (val)
{
case (Test.TestValue1) : DoSomething();
break;
case (Test.TestValue2) : DoSomethingElse();
break;
default : Do Nothing();
}
}
答案 5 :(得分:1)
枚举就像设计一样工作 正如msdn所说:
底层类型指定了多少 存储分配给每个 枚举。但是,一个明确的演员 从枚举类型转换是必要的 到一个完整的类型。
答案 6 :(得分:1)
首先我想提一下你正在尝试这个
Console.WriteLine(Test.TestValue1);
你会发现一些事情。
输出不是数字,甚至不是整数。
此外,这也应该回答你的第二个问题。
所以你必须每次都明确地将你的枚举转换为整数。
:)
答案 7 :(得分:1)
正如Paul所指出的那样,你有一个语法错误应该解决(你已经明确修复了)。正如其他人指出的那样测试是一个包含整数值的枚举。例如,可以使用枚举来轻松处理x0001或0xA0BC(41148)等值。
在示例中,您使用的是 Int32 IntTest ,它是一个32位整数;我可能会补充说,你应该使用 int 而不是 Int32 ,除非你的枚举中包含其他内容,否则整数甚至不指定:int 因为默认保持类型确实是整数。
关于编译器强制你判断该值的原因;它的工作方式,枚举不是整数,只有其可能的子属性(TestValue1,TestValue2,TestValue3)的值是整数。 *
正如有人指出将在Console.WriteLine中打印的内容不是整数。*
答案 8 :(得分:0)
首先,枚举的: int
部分完全是多余的,因为int
已经是枚举的默认管理类型。
需要强制转换,因为在编写枚举时,实际上是在定义一个新的Type
,就像一个类。名为Test
的枚举的任何值都属于Test
类型。