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

Jos*_*ola 5 c# vb.net enums

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

Public Enum Status As Short
    Open = AscW("O")
    Closed = AscW("C")
    Pending = AscW("P")
    EnRoute = AscW("E")
End Enum
Run Code Online (Sandbox Code Playgroud)

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

谷歌搜索后,我发现的一般相当于.NET AscWConvert.ToInt32("C").当我尝试在枚举中使用该语句时,我得到编译器错误"Constant Expression Required".

我怎么能在C#中做到这一点?有没有更好的办法?

Meh*_*ari 10

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

public enum Status { 
   Open = 'O',
   Closed = 'C',
   Pending = 'P',
   EnRoute = 'E'
}
Run Code Online (Sandbox Code Playgroud)

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

引用Visual Basic规范:

11.2常数表达式

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

[...]

  • 以下运行时函数:

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

  • 尼克:在"Microsoft.VisualBasic"中声明它并不重要.关键是编译器很难理解`AscW`并且它在运行时并没有真正调用任何方法.它只是在编译时将表达式替换为其整数值. (3认同)
  • +1,它比那个稍微复杂一点.编译器很好地理解了AscW和VB运行时的一个特性.在表达式为常量且有效的情况下,编译器将优化AscW调用.但是在它不是常数或不理解的情况下,它将遵循VB运行时. (2认同)