2009-01-04 13 views

Respuesta

7

Desde el C# Language Specification (§ 17.3 y 14.16):

17.3 Constantes

Una constante es un miembro de clase que representa un valor constante: un valor que se puede calcular en tiempo de compilación.

y

14.16 Las expresiones constantes

Una expresión constante es una expresión que se evaluado completamente en tiempo de compilación. Cuando se requiere que una expresión sea constante, esto es indicado en la gramática mediante la expresión constante . [...] Las siguientes construcciones se permiten en expresiones constantes:

  • literales (incluyendo el nulo literal)
  • Las referencias a los miembros const de clase y tipos struct.
  • Referencias a miembros de tipos de enumeración.
  • Sub-expresiones entre paréntesis, que a su vez son expresiones constantes.
  • Emitir expresiones, siempre que el tipo de destino sea uno de los tipos enumerados anteriormente.
  • operadores predefinidos marcados y no marcados, +, -,! Y ~ unarios.
  • El predefinida +, -, *, /,%, < <, >>, &, |, ^, & &, ||, ==, =, <,>, = <, y> = ! operadores binarios, siempre que cada operando sea del tipo mencionado anteriormente.
  • El operador:: conditional.
  • expresiones sizeof, siempre que el tipo no gestionado sea uno de los tipos especificados en §14.5.12.
  • valor predeterminado expresiones, siempre que el tipo es uno de los tipos mencionados anteriormente, o el tipo es un tipo de referencia o un parámetro de tipo que se sabe que es un tipo referencia (§25.7).

Los siguientes conversiones están permitidos en constantes expresiones:

  • Identidad conversiones
  • conversiones numéricas
  • conversiones de enumeración

Otra manera de lograr lo que se querer es use un miembro estático de solo lectura. Los miembros de solo lectura se evalúan en tiempo de ejecución, no en tiempo de compilación. Por lo tanto, puede usar el método ToString().

private static readonly EscapeString = EscapeChar.ToString(); 

Nota: Debido a un campo de sólo lectura se puede iniciar ya sea en la declaración o en el constructor de una clase, campos de sólo lectura pueden tener diferentes valores dependiendo del constructor utilizado.

Aquí hay un buen artículo sobre differences between const and readonly members.

5

no veo ninguna manera de hacerlo, que estoy de acuerdo es un poco de una pena - pero es lo que realmente necesidad que sea un lugar de conststatic readonly? Este último tendrá casi la misma semántica.

+0

No necesariamente, una de sólo lectura es probablemente suficiente. Ambos son privados, por lo que no importará mucho. Pero pensé que el compilador debería poder proporcionar tales operaciones implícitamente. ¡También noté que lo opuesto tampoco es posible! (es decir, inicializando el carácter de la cadena) –

1

La única manera que se me ocurre (ambos no es ideal) son:

const string EscapeString = "\\"; 
private static readonly EscapeString = EscapeChar.ToString(); 

O simplemente podría seguir con la versión de carbón y ToString() siempre que necesite la versión de cadena :)

1

C# .Net const requiere que su valor se inicialice en tiempo de compilación. Esa es la razón, su código no está compilando. Puede usar el campo de solo lectura para asignar el valor del tiempo de ejecución.

Sin embargo, a raíz de código funcionará:

const char EscapeChar = '\\'; 
readonly string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)