define - Declarando un const double[] en C#?
enum c# (6)
Esta pregunta ya tiene una respuesta aquí:
Tengo varias constantes que uso, y mi plan era ponerlas en un conjunto de dobles, sin embargo, el compilador no me deja.
Intenté declararlo de esta manera:
const double[] arr = {1, 2, 3, 4, 5, 6, 73, 8, 9 };
Luego me decidí por declararlo como estático de solo lectura:
static readonly double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
Sin embargo, la pregunta permanece. ¿Por qué el compilador no me permite declarar una matriz de valores const? ¿O lo hará, y simplemente no sé cómo?
Desde MSDN ( http://msdn.microsoft.com/en-us/library/ms228606.aspx )
Una expresión constante es una expresión que se puede evaluar completamente en tiempo de compilación. Debido a que la única forma de crear un valor no nulo de un tipo de referencia [una matriz] es aplicar el nuevo operador y porque el nuevo operador no está permitido en una expresión constante, el único valor posible para las constantes de referencia. tipos distintos de cadena es nulo.
El http://msdn.microsoft.com/en-us/library/ms228606.aspx te dice exactamente por qué no puedes hacerlo:
''arr'' es del tipo ''double []''.
Un campo const de un tipo de referencia que no sea una cadena solo se puede inicializar con nulo.
El problema es que estás declarando una matriz constante de dobles, no una matriz de dobles constantes. No creo que haya una manera de tener una matriz de constantes debido a la forma en que las matrices funcionan en C #.
Esto es probablemente porque
static const double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
es de hecho lo mismo que decir
static const double[] arr = new double[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9};
Un valor asignado a un const tiene que ser ... const. Cada tipo de referencia no es constante y una matriz es un tipo de referencia.
La solución que mi investigación mostró fue el uso de un solo de lectura estática. O, en tu caso con un número fijo de dobles, dale a todo un identificador individual.
Editar (2): un pequeño sidenode, cada tipo se puede usar const, pero el valor asignado debe ser const. Para los tipos de referencia, lo único que puede asignar es nulo:
static const double[] arr = null;
Pero esto es completamente inútil. Las cadenas son la excepción, también son el único tipo de referencia que se puede usar para argumentos de atributos.
No hay forma de tener una matriz de const en C #. Debe usar indizadores, propiedades, etc. para garantizar que los contenidos de la matriz no se modifiquen. Es posible que necesite volver a evaluar el lado público de su clase.
Solo para señalar ... Estático de solo -IS NO CONST-
Esto es perfectamente válido y no es lo que quería:
class TestClass
{
public static readonly string[] q = { "q", "w", "e" };
}
class Program
{
static void Main( string[] args )
{
TestClass.q[ 0 ] = "I am not const";
Console.WriteLine( TestClass.q[ 0 ] );
}
}
Necesitarás encontrar otras formas de proteger tu matriz.
No sé por qué necesitabas hacerlo de forma constante o de solo lectura. Si realmente desea que toda la matriz sea inmutable, una palabra clave simple de constante / de solo lectura no lo ayudará, y lo que es peor, también podría desviarlo al camino equivocado.
Para cualquier tipo de referencia no inmutable, hacerlos de solo lectura significa que no se puede volver a asignar la variable en sí , pero el contenido aún se puede cambiar. Vea el siguiente ejemplo:
readonly double[] a = new double[]{1, 2, 3};
...
a = new double[] {2,3}; // this won''t compile;
a[1] = 4; // this will compile, run and result the array to {1, 4, 3}
Dependiendo de su contexto, puede haber algunas soluciones, una de ellas es, si lo que realmente necesita es una lista de dobles, List a = new List () {1,2,3,4,5} .AsReadOnly (); le dará una lista de doble contenido.