2010-11-22 94 views
6

下午好,在C#铸造,让我们说我有枚举使用整数枚举不

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的地方有一个恒定的值......这个值是不是恒定的?

非常感谢。

+3

不应该是'case(Test.TestValue1)''而不是'case(TestValue1)'吗?你想与枚举进行比较,对吧? – 2010-11-22 15:44:39

回答

8

请注意,你可以这样做:

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

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

3

您必须投射,因为语言定义说您必须投射。冗余?也许。但事情就是这样。

为了您switch声明:

switch (IntTest) 
{ 
    case (int)Test.TestValue1: DoSomething(); break; 
} 

枚举值必须与该枚举类型的名称完全合格。

5

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

如果您需要Int32,请使用Int32;如果您需要Test,请使用Test;如果您需要在它们之间进行转换,则使用明确的转换。

(当然,语言很容易被只具备让这些隐式转换,但这样的“功能”可能会带来更多的问题比它解决的。)

0
  • 首先,您的枚举的: int部分是完全多余的,因为int是enum的默认管理类型。

  • 需要强制转换,因为当你编写一个枚举时,你实际上定义了一个新的Type,很像一个类。名为Test的枚举值的类型为Test

1

枚举的工作原理是,通过设计
作为MSDN说:

的基本类型指定 存储多少分配给每个 枚举。但是,显式转换 对于将枚举类型 转换为整数类型是必要的。

1

嘿嘿,我刚刚在我的书中读过这章。

第一件事,我想提一提你正在尝试这种

Console.WriteLine(Test.TestValue1); 

你会发现一些东西。

输出不是数字,甚至不是整数。

此外,这也应该回答你的第二个问题。

所以你必须明确地将你的枚举转换为整数。

:)

1

正如保罗指出你应该可以解决(你显然已经固定)语法错误。正如其他人指出的那样测试是一个枚举值,它保存一个整数的值。举例来说,枚举可以轻松处理像x0001或0xA0BC(41148)这样的值。

在您使用的示例中Int32 IntTest这是一个32位整数;我可能会添加你应该使用int而不是int32除非你的枚举持有一些其他的一个整数甚至不指定:int因为默认的持有类型确实是整数。

关于编译器迫使你处理该值的原因;它只是如何工作,枚举不是一个整数,只有其可能的子属性(TestValue1,TestValue2,TestValue3)的值是整数。 *

正如有人指出的是什么将在Console.WriteLine打印不是整数*

2

我想以与此相同的方式实现枚举,以简化将使用表列名作为字符串的应用程序转换为索引的过程。

这就是我想要实现:

enum TableName 
{ 
    Column1Name = 0 
} 

Column1Data = (cast)objData[RowIndex][TableName.Column1Name]; 

如上面提到的是,C#中使用枚举的

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 ;) 
1
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(); 
    } 
}