2009-07-10 3 views
45

У меня есть несколько констант, которые я использую, и мой план состоял в том, чтобы поместить их в массив const из парных разрядов, однако компилятор мне не позволяет.Объявление const double [] в C#?

Я попытался объявить это следующим образом:

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

ответ

38

Из MSDN (http://msdn.microsoft.com/en-us/library/ms228606.aspx)

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

44

Это, вероятно, потому, что

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

Значение, присвоенное константный должен быть ... константный. Каждый ссылочный тип не является постоянным, а массив является ссылочным типом.

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


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

static const double[] arr = null; 

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

+0

Право на. См. Http://msdn.microsoft.com/en-us/library/ms228606.aspx –

+0

Точно так же, как здесь: http://www.gamedev.net/community/forums/topic.asp?topic_id=276930 – Dykam

+4

String является ссылочным типом, и вы можете иметь постоянные строки ... –

1

The compiler error говорит вам, почему именно вы не можете сделать это:

'обр' имеет тип 'двойной [].
Поле const ссылочного типа, отличное от строки, может быть инициализировано нулем.

2

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

9

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

Просто указать хотя ... Static чтения -is НЕ 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 ]); 
    } 
} 

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

3

Я не знаю, почему вам нужно было сделать это как постоянным, так и читаемым. Если вы действительно хотите, чтобы весь массив был неизменным, то простое ключевое слово 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} 

В зависимости от контекста, может быть какие-то решения, один из них, если то, что вам действительно нужно, это список дважды, Перечислите а = новый список() {1,2, 3,4,5} .AsReadOnly(); предоставит вам список с двойным содержанием.

 Смежные вопросы

  • Нет связанных вопросов^_^