2009-12-02 8 views
13
[TestClass] 
public class MsProjectIntegration { 
    const int? projectID = null; 
    // The type 'int?' cannot be declared const 
    // ... 
} 

¿Por qué no puedo tener un const int??¿Por qué los nulables no pueden declararse const?

Edit: La razón por la que quería un nullable int como const es porque solo lo estoy usando para cargar algunos datos de muestra de una base de datos. Si es nulo, solo iba a inicializar datos de muestra en tiempo de ejecución. Es un proyecto de prueba muy rápido y obviamente podría usar 0 o -1 pero int? parecía la estructura de datos correcta para lo que quería hacer. de sólo lectura que parece ser el camino a seguir

+12

Práctica recomendada: use las constantes solo para las cosas que * son lógicamente constantes para toda la eternidad *. Bueno: la cantidad de artículos en una docena, el año en que nació Elvis, el número atómico de plomo. Malo: números de versión: cambian de versión a versión; las cosas que cambian no deben ser constantes. Terrible: el tipo de cambio actual entre el yen y el euro; cambia cada segundo. –

+0

Sí, básicamente estaba utilizándolo como un archivo de configuración ad hoc, definitivamente no es la mejor práctica – Shawn

+0

¿No debería ser "Sí, realmente, básicamente ...?"

Respuesta

19

No es solo nullables; Sólo los tipos incorporados en el tiempo de ejecución se pueden declarar const (de memoria, es Bools, los diversos tipos de int, flotadores/dobles, y cadenas).

¿Por qué? Porque el valor se incrusta directamente en el ensamblado en tiempo de compilación, y no hay forma de incrustar tipos definidos por el usuario.

readonly La palabra clave debe hacer lo que tiene, sin embargo. En contraste con const, cualquier campo readonly se inicializa en tiempo de ejecución en lugar de compilar, por lo que se puede inicializar con más o menos la expresión que desee.

Editar: como señala Eric Lippert, no es tan sencillo. Por ejemplo, const decimal funciona.

Este:

private const decimal TheAnswer = 42; 

...compilaciones (bueno, reflectores) a esto:

[DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)] 
private static readonly decimal TheAnswer; 
+0

gracias, la parte del ensamblaje fue esclarecedora e hizo de esto la mejor respuesta (para mí) – Shawn

+1

+1 para exponer en solo –

+14

Esto no es correcto. Primero: los decimales no son un tipo incorporado, pero pueden ser const. Segundo: sí, hay formas de incorporar tipos constantes definidos por el usuario; * elegimos * no implementar esta característica. Ciertamente es * posible * en principio. (Prueba: lo hicimos por decimal.) –

13

http://en.csharp-online.net/const,_static_and_readonly

Las constantes deben ser de un tipo entero (sbyte, byte, short, ushort, int, uint, largo, ulong, char, float, doble , decimal, bool o cadena), una enumeración , o una referencia a nulo.

Desde clases o estructuras se inicializan en tiempo de ejecución con el nuevo de palabras clave, y no en tiempo de compilación, que no pueden establecer una constante a una clase o estructura.

Dado que nullable es una estructura, la cita anterior es la razón por la cual.

8

No puede tener un tipo de referencia const (o una estructura), por lo tanto, no puede tener un const int? que es en realidad un Nullable<int>.

puede marcarlo como de sólo lectura

readonly int? projectID = null; 

Entonces no puede ser modificado fuera de los constructores de clase.

+4

'Nullable ' no es un tipo de referencia, sino una estructura. ;) – Lucero

+0

Lucero tiene razón: http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx –

+0

Usted es, por supuesto, ambos correctos. La respuesta ha sido modificada. –

3

Es posible que desee considerar el uso del modificador "readonly" en su lugar.

const s se evalúan en tiempo de compilación, mientras que readonly s se aplican en tiempo de ejecución. Las instancias de tipos complejos no se pueden compilar en el ensamblado, por lo que deben crearse en tiempo de ejecución.

+3

'Nullable ' no es un tipo de referencia, sino una estructura. ;) – Lucero

+0

Mierda, mi mal. Fijo. –

3

Básicamente, se está diciendo:

tengo una clase con un campo projectId que pueden o no pueden tener un valor, pero que, en hecho NUNCA tiene un valor, es siempre indefinido.

Desde un punto de vista lógico ... la declaración en sí no tiene sentido.

+0

porque es una configuración que podría ser nula y preferiría no codificar un número mágico ... digamos -1 – Shawn

+0

Si projectId es "const" no se puede cargar nada desde la base de datos ... de hecho no puede hacer casi nada con eso. –

+0

es una clave principal – Shawn

Cuestiones relacionadas