2012-03-22 12 views
10

Con este código:¿Por qué no puedo usar una "constante" dentro de una declaración de interruptor dentro del alcance?

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; 

... tengo que sustituir "TABCONTROL_BASICINFO" con "0", o lo que consigo, "Un valor constante es espera"

cielos a Murgatroyd! ¿No puede mirar hacia arriba y ver que TABCONTROL_BASICINFO es 0?

+0

frustrante eh! Tengo que usar una const actual en lugar de la statics readonly :( – mellodev

Respuesta

19

Si usted quiere que sea una expresión constante en lo que se refiere al compilador, declarará como const:

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

O seguir las convenciones de nomenclatura de .NET ...

private const int TabControlBasicInfo = 0; 

O use una enumeración, dado que básicamente tiene un conjunto de valores fijo:

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

Por cierto, también se puede cambiar en las cadenas en C#, por lo que este:

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

puede llegar a ser:

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

sólo lectura estática no es una variable constante. Puede ser inicializado. Mientras que "const" es constante.

12

Una variable readonly no es una constante. El valor no se conoce en tiempo de compilación, pero se puede inicializar en la declaración (como lo ha hecho) o en el constructor de la clase (en este caso, el constructor estático para su clase).

Para más información, véase

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

Puede cambiarlo a:

private const int TABCONTROL_BASICINFO = 0; 

A menos que necesite para calcular algo para inicializar la variable, declarará como const. Será un poco más eficiente.

+0

Esta es la respuesta real – tedebus

7

Eso no es una constante; es una variable de solo lectura. Si desea que sea una constante, márquelo como una constante.

private const int TabControlBasicInfo = 0; 

O aún mejor:

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

¿Por qué es una enumeración mejor en este caso? ¿Simplemente porque agrupa los valores relacionados? –

+2

@EricJ. Mirando cómo están estructurados los nombres de solo lectura, y cómo él está tratando de usarlos, 'enum' parece ser la estructura correcta. – asawyer

+0

cuando hago eso, obtengo," No se puede convertir implícitamente el tipo 'UserControlsOnTabPagePOCApp.Form1.TabControl' a 'int'. Una conversión explícita existe (¿falta un molde?) " –

Cuestiones relacionadas