Ответ 1
Это часть дизайна языка С#, если я правильно помню. const
зарезервирован для элементов, которые могут выводить их содержимое во время компиляции, т.е. до (во время) программа даже построена, а затем запустится. Все массивы на С# представляют собой массивы времени выполнения (их длины определяются, когда программа работает, а не раньше), и поэтому они не могут быть сделаны в поля const
. Я считаю, что это ограничение С#, но это то, как они решили это сделать.
Причиной ссылочных типов может быть null, так как null
является постоянным значением, тогда как ваш инициализатор (который выполняется во время выполнения) не является. null
встроен в язык, поэтому по этой логике его значение всегда известно, все время (и, следовательно, можно использовать для ссылочных типов времени компиляции).
EDIT:
Вы должны иметь возможность создать статическую таблицу, которая будет инициализирована в момент ее использования или необходимости любым другим кодом:
public static int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
^ Static Keyword
Вы можете получить доступ к нему как (если он еще находится в class A
):
A.i[0, 1]
Я надеюсь, что это поможет вам
Чтобы узнать больше, посмотрите MSDN: http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(CS0134);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true
EDITEDIT:
Если вам нужно приклеить статическую таблицу к коду и никогда не позволять кому-либо изменять ее после ее инициализации, для этого нужно ключевое слово readonly
:
public static readonly int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
^ Static ^Readonly Keywords
Имейте в виду, это не помешает вам повторно назначать вещи в эти слоты, но это примерно так же, как С#, может дать вам, за исключением создания свойства или возврата нового массива каждый раз.