2012-03-22 69 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

相關問題