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

Я не думаю, что возможно получить тип, когда значение является пустым. Кроме того, так как Вы звоните в GetParameterValue, лучшее, которое Вы могли сделать (когда значение является пустым) должно получить тип "целевого" параметра, который является "объектом". Вы могли бы рассматривать передачу Типа в качестве параметра к GetParameterValue, где у Вас есть больше информации, такой как:

public void GetParameterValue(Type sourceType, out object destination) { //... }
46
задан David Božjak 10 July 2009 в 14:18
поделиться

6 ответов

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

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

40
ответ дан 26 November 2019 в 20:19
поделиться

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

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

1
ответ дан 26 November 2019 в 20:19
поделиться

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

2
ответ дан 26 November 2019 в 20:19
поделиться

Вероятно, это потому, что

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): Небольшой побочный элемент, каждый тип может использоваться как const, но присвоенное ему значение должно быть const. Для ссылочных типов единственное, что вы можете присвоить, - это null:

static const double[] arr = null;

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

46
ответ дан 26 November 2019 в 20:19
поделиться

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

Просто чтобы указать ... Статическое только для чтения -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 ] );
    }
}

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

9
ответ дан 26 November 2019 в 20:19
поделиться

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

В зависимости от вашего контекста могут быть некоторые решения, одно из них: если вам действительно нужен список double, List a = new List () {1,2,3,4, 5} .AsReadOnly (); предоставит вам список double.

3
ответ дан 26 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: