Объявление константного двойного [] в C #? [Дубликат]

На этот вопрос уже есть ответ:

Почему C # ограничивает набор типов, которые могут быть объявлены как const? 6 ответов

У меня есть несколько констант, которые я использую, и я планировал поместить их в константный массив значений типа double, однако компилятор мне не позволил.

Я пытался объявить это так:

const double[] arr = {1, 2, 3, 4, 5, 6, 73, 8, 9 };

Затем я решил объявить его статическим только для чтения:

static readonly double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};

Однако вопрос остается. Почему компилятор не позволяет мне объявлять массив значений const? Или так, а я просто не знаю как?

Ответы на вопрос(6)

Решение Вопроса

http: //msdn.microsoft.com/en-us/library/ms228606.asp)

Константа-выражение - это выражение, которое может быть полностью оценено во время компиляции. Поскольку единственный способ создать ненулевое значение ссылочного типа [массив] - применить новый оператор, а новый оператор недопустим в выражении константы, единственно возможное значение для констант ссылки типы, отличные от string, имеют значение null.

потому что

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, должно быть ... const. Каждый ссылочный тип не является константой, а массив является ссылочным типом.

Решением, которое показало мое исследование, было использование статического чтения только. Или, в вашем случае с фиксированным числом двойных чисел, присвойте всем индивидуальный идентификатор.

Edit (2): Небольшой sidenode, каждый тип может быть использован const, но назначенное ему значение должно быть const. Для ссылочных типов единственное, что вы можете назначить, это null:

static const double[] arr = null;

Но это совершенно бесполезно. Строки являются исключением, они также являются единственным ссылочным типом, который можно использовать для аргументов атрибутов.

 Ray Vernagus10 июл. 2009 г., 16:26
 Dykam10 июл. 2009 г., 16:27
 Jon Skeet10 июл. 2009 г., 16:27
String является ссылочным типом, и вы можете иметь постоянные строки ...
 Sean10 июл. 2009 г., 16:29
@ Джон: Строки неизменны.
 Sean10 июл. 2009 г., 16:32
Clarification: я имею в виду, что в то время как строки являются ссылочными типами, так как они неизменяемы, имеет смысл, что они могут быть постоянными.

свойства и т. Д., Чтобы гарантировать, что содержимое массива не будет изменено. Возможно, вам придется пересмотреть публичную сторону вашего класса.

Просто хочу указать ... Статическое чтение только -НЕ СОГЛАСНО-

Это совершенно верно, а не то, что вы хотели:

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 ] );
    }
}

Вам нужно будет найти другие способы защиты вашего массива.

зачем тебе нужно было сделать это постоянным или только для чтения. Если вы действительно хотите сделать весь массив неизменным, то простое ключевое слово константы / только для чтения вам не поможет, и, что еще хуже, оно также может отвлечь вас от неправильного пути.

Для любых неизменяемых ссылочных типов делайте их только для чтения, что означает, что вы никогда не сможете переопределить переменнуюса, но содержание все еще изменчиво. Смотрите ниже пример:

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 () ; выдаст список содержимого, доступный только для чтения.

что вы объявляете константный массив double, а не массив константных double. Я не думаю, что есть способ получить массив констант из-за того, как работают массивы в C #.

ошибка компилятора точно говорит вам, почему вы не можете этого сделать:

'arr' имеет тип 'double []'.
Константное поле ссылочного типа, отличного от строки, может быть инициализировано только нулем.

Ваш ответ на вопрос