2012-03-22 1 views
10

Con questo codice:Perché non posso utilizzare una "costante" all'interno di un'istruzione switch all'interno dell'ambito?

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; 

... devo sostituire "TABCONTROL_BASICINFO" con "0", o ricevo, "Un valore costante è previsto"

Cieli a Murgatroyd! Non è possibile cercare e vedere che TABCONTROL_BASICINFO è 0?

+0

Frustrante eh! Devi usare una const effettiva piuttosto che la statica di sola lettura :( – mellodev

risposta

19

Se si vuole rendere un'espressione costante per quanto riguarda il compilatore è interessato, dichiareremo come const:

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

O seguire le convenzioni di denominazione NET ...

private const int TabControlBasicInfo = 0; 

oppure utilizzare un enum, visto che hai avuto fondamentalmente un insieme fisso di valori:

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

Tra l'altro, è anche possibile passare sulle stringhe in C#, quindi questo:

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

può diventare:

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

statico di sola lettura non è una variabile costante. Può essere inizializzato. Considerando che "const" è costante.

12

Una variabile readonly non è una costante. Il valore non è noto al momento della compilazione, ma può essere inizializzato o nella dichiarazione (come è stato fatto) o nel costruttore della classe (in questo caso, il costruttore statico della classe).

Per ulteriori vedere

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

È possibile modificarla in:

private const int TABCONTROL_BASICINFO = 0; 

A meno che non è necessario calcolare qualcosa per inizializzare la variabile, dichiareremo come const. Sarà leggermente più efficiente.

+0

Questa è la vera risposta – tedebus

7

Questo non è una costante; è una variabile di sola lettura . Se si desidera che sia una costante, contrassegnarla come costante.

private const int TabControlBasicInfo = 0; 

O ancora meglio:

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

Perché in questo caso è meglio enum? Solo perché raggruppa i valori correlati? –

+2

@EricJ. Guardando a come sono strutturati i nomi di sola lettura, e come lui sta cercando di usarli, 'enum' sembrerebbe essere la struttura corretta. – asawyer

+0

quando lo faccio, ottengo," Impossibile convertire implicitamente il tipo 'UserControlsOnTabPagePOCApp.Form1.TabControl' in 'int'. Una conversione esplicita esiste (ti manca un cast?) " –