Подтвердить что ты не робот

Объявление константы 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? Или это, и я просто не знаю, как?

4b9b3361

Ответ 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 ссылочного типа, отличное от строки, может быть инициализировано только нулевым значением.