Объявление константы double [] в С#?
У меня есть несколько констант, которые я использую, и мой план состоял в том, чтобы поместить их в массив const из парных разрядов, однако компилятор мне не разрешил.
Я пробовал объявить его так:
const double[] arr = {1, 2, 3, 4, 5, 6, 73, 8, 9 };
Затем я решил объявить его статическим readonly:
static readonly double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
Однако вопрос остается. Почему компилятор не может объявить массив значений const? Или это, и я просто не знаю, как?
Ответы
Ответ 1
Из MSDN (http://msdn.microsoft.com/en-us/library/ms228606.aspx)
Постоянное выражение представляет собой выражение которые могут быть время компиляции. Потому что единственный способ создать ненулевое значение ссылочный тип [массив] предназначен для применения нового оператора, а потому, что новый оператор не допускается в постоянное выражение, единственно возможное значение для констант ссылочных типов кроме строки, является нулевым.
Ответ 2
Возможно, это связано с тем, что
static const double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
на самом деле то же самое, что сказать
static const double[] arr = new double[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9};
Значение, присвоенное константе, должно быть... const. Каждый ссылочный тип не является константным, а массив является ссылочным типом.
В результате моего исследования было использовано статическое readonly. Или, в вашем случае с фиксированным числом удвоений, укажите все индивидуальный идентификатор.
Edit (2):
Небольшой sidenode, каждый тип может использоваться const, но назначенное ему значение должно быть const. Для ссылочных типов единственное, что вы можете назначить, равно null:
static const double[] arr = null;
Но это совершенно бесполезно. Строки являются исключением, это также единственный ссылочный тип, который может использоваться для аргументов атрибута.
Ответ 3
В С# нет способа иметь массив const. Вам нужно использовать индексы, свойства и т.д., Чтобы содержимое массива не изменялось. Возможно, вам придется переоценить публичную сторону вашего класса.
Просто указать, хотя... Static readonly -IS NOT CONST -
Это совершенно верно, а не то, что вы хотели:
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 ] );
}
}
Вам нужно будет найти другие способы защиты вашего массива.
Ответ 4
Я не знаю, почему вам нужно было сделать это как постоянным, так и читаемым. Если вы действительно хотите, чтобы весь массив был неизменным, то простое ключевое слово constant/readonly не поможет вам, и что еще хуже, оно может также отклонить вас к неправильному пути.
Для любых неизменяемых ссылочных типов сделать их только для чтения означает, что вы никогда не сможете переопределить переменную , но контент по-прежнему изменчив. Пример ниже:
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}
В зависимости от вашего контекста могут быть некоторые решения, один из них, если вам действительно нужен список из двух, List a = new List() {1,2,3,4,5}.AsReadOnly(); предоставит вам список, состоящий только из двух слов.
Ответ 5
Проблема заключается в том, что вы объявляете постоянный массив double, а не массив постоянных удвоений. Я не думаю, что есть способ иметь массив констант из-за того, как массивы работают на С#.
Ответ 6
ошибка компилятора сообщает вам, почему вы не можете этого сделать:
'arr' имеет тип 'double []'.
Поле const ссылочного типа, отличное от строки, может быть инициализировано только нулевым значением.