Ожидается постоянное значение при инициализации массива

#c#

#c#

Вопрос:

Я разрабатываю программное обеспечение для обработки изображений.

 int size = 3;

int[,] kernel = new int[size, size] {
        {1, 2, 1},
        {2, 4, 2},
        {1, 2, 1}
};
  

Когда я компилирую свой код, у меня появляется сообщение об ошибке компиляции «Ожидается постоянное значение» от size переменной. Я понимаю, что могу поставить 3 при своей kernel инициализации массива или сделать свою size константу. Я спрашиваю о технической причине этой ошибки, потому что для меня эта ошибка не имеет никакого смысла.

Ответ №1:

Вы можете либо создать массив с пустыми значениями, указав только размер (который может быть переменным), либо перечислить значения в инициализаторе и при необходимости указать постоянный размер. Но вы не можете комбинировать инициализатор с непостоянным размером. В случае инициализатора вам разрешено указывать постоянные значения для размера, если вы хотите убедиться, что результатом инициализатора будет массив определенного размера.

Просто избавьтесь от параметров размера, в вашем списке инициализаторов размер уже указан.

Комментарии:

1. Это была моя проблема — имеет смысл, если подумать об этом. К сожалению, мое «оправдание» в том, что мне также приходится кодировать в VB.Net. (Вы бы использовали: Dim values As Object() = New Object(columnIds.Length - 1) {} в VB.Net ), но только в C #: object[] values = new object[columnIds.Length];

Ответ №2:

Компилятору требуется постоянное выражение для рангов массива. Вы можете объявить size как const int , или вы можете просто позволить компилятору вычислить это из выражения инициализации:

     int[,] kernel = new int[,] {
            {1, 2, 1},
            {2, 4, 2},
            {1, 2, 1}
    };
  

Ответ №3:

При уточнении вы добавляете элементы, поэтому вам не нужно указывать размер.

Так что это сработает :

 int[,] kernel = new int[,] { 
        {1, 2, 1}, 
        {2, 4, 2}, 
        {1, 2, 1} 
};