Это всего лишь предположение, но я думаю, что причина, возможно, связана с тем фактом, что значения const помещаются в метаданные (которые имеют незначительные последствия, все по своему) при компиляции. Интересно, может быть, у компилятора возникли проблемы с выяснением того, как преобразовать переменную в метаданные.
В книге Рихтера CLR VIA C # (стр. 177),
Определение постоянной причины создания
метаданных. Когда код относится к
константный символ, компиляторы смотрят вверх
этот символ в метаданных
сборка, которая определяет эту константу,
извлечь значение константы, и
вставлять значение в испускаемый IL
Код.
Далее он отмечает, что это означает, что по этой причине вы не можете получить ссылку на постоянную память. Чтобы сделать это немного более явным, в psuedo C #, если сборка A определяет const:
//Assembly A, Class Widget defines this:
public static const System.Decimal Pi = 3.14
тогда у вас есть потребитель A:
//somewhere in the Program.exe assembly
decimal myCircleCurcum = 2 * Widget.pi
результирующий скомпилированный IL из program.exe будет делать что-то вроде этого псевдокода:
// pseudo-IL just to illustrate what would happen to the const
myCircleCurcum = 2*3.14
обратите внимание, что сборка, потребляющая , даже не подозревает, что десятичная дробь 3.14 вообще имела какое-либо отношение к сборке A - это для program.exe буквальное значение . Для меня это разумный способ для компилятора C # - в конце концов, сборка A явно объявила , что pi является константой (это означает, что значение раз и навсегда pi = 3.14). Но я рискну предположить, что 99% разработчиков на C # не понимают последствий этого и могут изменить пи на 3.1415 по прихоти.
У констант действительно плохая история версий кросс-сборки (опять же, это исходит от Рихтера), потому что потребитель сборки A с константой в ней не увидит изменения, если константа сборки A изменится (то есть перекомпилирована). Это может привести к тому, что потребителю сборки А. будет очень сложно выяснить ошибки. , настолько, что я запретил моей команде использовать константы. Их небольшой прирост производительности не стоит тех тонких ошибок, которые они могут вызвать.
На самом деле вы можете использовать константу только в том случае, если знаете, что значение никогда не изменится, никогда не изменится - и даже если что-то установлено как константа, например, пи, вы не можете точно сказать, что Вы не хотите, чтобы ваше разрешение изменилось в будущем.
если сборка А определяет:
decimal const pi = 3.14
затем вы создаете его, а затем другие сборки используют его, если вы затем измените сборку A:
decimal const pi = 3.1415
и перестройте сборку A, потребитель сборки A все равно будет иметь старое значение 3.14! Зачем? потому что исходный 3.14 был определен как константа, что означает, что потребителям сборки A сказали, что значение не изменится, - поэтому они могут запекать это значение pi в свои метаданные (если вы перестраиваете потребителя сборки A, то это затем получит новое значение пи в своих метаданных). Опять же, я не рассматриваю это как проблему с тем, как CSC обрабатывает константы - просто разработчики, вероятно, не ожидают, что константа не может быть безопасно изменена при некоторых обстоятельствах, где она может быть безопасно изменены в других. Безопасно: потребители никогда не получат ссылки только по .dll (т.е. они всегда будут собираться из исходного кода КАЖДЫЙ ВРЕМЯ), небезопасно: потребители не имеют представления о том, когда исходный код вашей сборки с const определил его, как он изменяется. В документации .NET, вероятно, следует сделать гораздо более ясным, что константа означает, что вы не можете изменить значение в исходном коде
По этой причине я настоятельно рекомендую не использовать константы, а просто сделать виджет доступным только для чтения. Сколько значений, которые вы действительно можете сказать, наверняка будут постоянными во веки веков?
Единственная реальная причина использовать const over readonly в моем уме, если что-то может повлиять на производительность ... но если вы столкнетесь с этим, я бы подумал, действительно ли C # является правильным языком для вашей проблемы. Короче говоря, для меня почти никогда не стоит использовать константы. Есть очень мало случаев, когда крошечное улучшение стоит потенциальных проблем.