在C#中使用整数枚举而不进行强制转换

时间:2010-11-22 15:41:49

标签: c# enums casting

下午好,假设我有枚举

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的位置有一个常量值...这个值是不是恒定不变?

非常感谢。

9 个答案:

答案 0 :(得分:8)

请注意,您可以这样做:

switch ((Test)IntTest)
{
    case (Test.TestValue1) : DoSomething();
                             break;
    case (Test.TestValue2) : DoSomethingElse();
                             break;
    default                : DoNothing();
}

即使枚举中没有值,也保证不会失败。如果枚举中不存在该值,则在Test实例上调用ToString()将返回基础数值的字符串表示形式。

答案 1 :(得分:7)

您不能互换地使用Int32Test,因为在语义上它们是不同的类型,即使它们碰巧使用相同的底层存储机制。

如果您需要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类型。