2012-03-22 95 views
10

有了这个代码:为什么我不能在范围内的switch语句中使用“常量”?

public partial class Form1 : Form 
{ 
    private static readonly int TABCONTROL_BASICINFO = 0; 
    private static readonly int TABCONTROL_CONFIDENTIALINFO = 1; 
    private static readonly int TABCONTROL_ROLESANDSECURITY = 2; 
    private static readonly int TABCONTROL_INACTIVEINFO = 3; 
. . . 
int ActiveTabPage = tabControlWorker.SelectedIndex; 
switch (ActiveTabPage) { 
    case TABCONTROL_BASICINFO: 
     if (currentNode == "NodeBuckingham") { 
     } else if (currentNode == "NodeNamath") { 
     } else if (currentNode == "NodeParsons") { 
     } else { 
     } 
    break; 

...我有 “0” 代替 “TABCONTROL_BASICINFO”,或者我得到的, “常数值 预期”

谢天Murgatroyd!它不能查看并看到TABCONTROL_BASICINFO是0吗?

+0

令人沮丧吧!要使用一个实际的常量而不是只读的静态:( – mellodev 2012-03-22 23:08:33

回答

19

如果你想使它成为一个常量表达式尽可能的编译器而言,其声明为const

// Note that static readonly is implied here 
private const int TABCONTROL_BASICINFO = 0; 

或者遵循.NET命名约定...

private const int TabControlBasicInfo = 0; 

或者使用一个枚举,因为你基本上有一组固定的值:

private enum TabControlType 
{ 
    // Could ditch the explicit values here if you want 
    BasicInfo = 0, 
    ConfidentialInfo = 1, 
    ... 
} 

顺便说一句,你也可以切换在C#字符串,所以这样的:

if (currentNode == "NodeBuckingham") { 
} else if (currentNode == "NodeNamath") { 
} else if (currentNode == "NodeParsons") { 
} else { 
} 

能成为:

switch (currentNode) { 
    case "NodeBuckingham": 
     ... 
     break; 
    case "NodeNamath": 
     ... 
     break; 
    case "NodeParsons": 
     ... 
     break; 
    default: 
     ... 
     break; 
} 
5

静态只读不是一个常数变量。它可以被初始化。而“const”是恒定的。

12

A readonly变量不是一个常数。该值在编译时并不知道,而是可以在声明中(正如您所做的那样)或在类构造函数(在这种情况下,为您的类的静态构造函数)中进行初始化。

更多看到

http://msdn.microsoft.com/en-us/library/acdd6hb7(v=vs.71).aspx

你可以把它改成:除非你需要计算的东西来初始化变量,声明为const

private const int TABCONTROL_BASICINFO = 0; 

。它会稍微更有效率。

+0

这是一个真正的答案 – tedebus 2017-12-07 15:05:36

7

这不是一个常数;它是一个只读变量如果你想要它是一个常量,那么将其标记为常量。

private const int TabControlBasicInfo = 0; 

甚至更​​好:

private enum TabControl 
{ 
    BasicInfo, 
    ... 
} 
... 
switch(whatever) 
{ 
    case TabControl.BasicInfo: 
+0

为什么在这种情况下枚举更好?只是因为它将相关值分组? – 2012-03-22 23:11:12

+2

@EricJ。看看只读名称的结构如何,以及他如何使用它们,'enum'看起来是正确的结构。 – asawyer 2012-03-22 23:13:36

+0

当我这样做时,我得到,“不能隐式地将类型'UserControlsOnTabPagePOCApp.Form1.TabControl'转换为'int'。是否存在(你是否缺少演员?)“ – 2012-03-22 23:52:15

相关问题