C#和VB.NET中枚举的区别

时间:2010-01-14 16:04:22

标签: c# vb.net enums

我们希望将旧版字符代码存储为新系统中的数字。为了提高开发人员的代码的可读性和一般理解,我想做这样的枚举......

Public Enum Status As Short
    Open = AscW("O")
    Closed = AscW("C")
    Pending = AscW("P")
    EnRoute = AscW("E")
End Enum

使用此设置,代码将是可读的(想象If Record.Status = Status.Open),然而这些值将作为小数字存储在数据库中,因此它将是高效的。但是......我是VB.NET的人,但是每个人都想用C#编写代码,所以我需要在C#中使用这种结构。

在谷歌搜索之后,我发现AscW的一般.NET等价物是Convert.ToInt32("C")。当我尝试在枚举中使用该语句时,我得到编译器错误“需要常量表达式”。

我怎样才能在C#中做到这一点?还有更好的方法吗?

2 个答案:

答案 0 :(得分:10)

方法调用不是常量表达式。试试这个:

public enum Status { 
   Open = 'O',
   Closed = 'C',
   Pending = 'P',
   EnRoute = 'E'
}

AscW在VB中工作的原因是它是VB编译器在编译时理解和评估的内部事物,并被编译器视为常量表达式。即使在VB中,Convert.ToInt32也无效。

引用Visual Basic specification

  

11.2常量表达式

     

常量表达式是一个表达式,其值可以在编译时完全计算。 [...] 在常量表达式中允许使用以下结构:

     

[...]

     
      
  • 以下运行时函数:

         
        
    • Microsoft.VisualBasic.Strings.ChrW
    •   
    • Microsoft.VisualBasic.Strings.Chr,如果常数值介于0到128之间
    •   
    • Microsoft.VisualBasic.Strings.AscW,如果常量字符串不为空
    •   
    • Microsoft.VisualBasic.Strings.Asc,如果常量字符串不为空
    •   
  •   

答案 1 :(得分:3)

试试这个:

public enum Status
{
    Open    = 'O',
    Closed  = 'C',
    Pending = 'P',
    EnRoute = 'E'
}