Подтвердить что ты не робот

Необязательные параметры "должны быть константой времени компиляции"

У меня есть класс, разделенный на два частичных файла, например:

public partial class PersonRepository : BaseRepository<Person>
{
    public static readonly string ColumnID = "ID";
    ...

и

public partial class PersonRepository : BaseRepository<Person>
{
    public List<Person> GetByCompany(int companyID, string sortExpression = ColumnID)
    {
    ...

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

4b9b3361

Ответ 1

Нет, выражение PersonRespository.ColumnID не классифицируется как константа времени компиляции. Выражение "ID" есть, но это не то, что вы используете в качестве параметра по умолчанию.

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

Если вы измените свое объявление на:

 public const string ColumnID = "ID";

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

Подробнее о том, что считается постоянным выражением, см. в разделе 7.19 спецификации языка С# 4.

Ответ 2

Вы должны объявить свой ColumnID как const.

Строка static readonly будет создана при первом обращении к классу в вашем коде, и вы также можете инициализировать ее с возвращаемым значением статического метода, поэтому это не константа времени компиляции для компилятора (даже если в этом случае это, очевидно, для человека, читающего код).

Ответ 3

const - это объявление с ключевым словом const.

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

Ответ 4

изменить

public static readonly string ColumnID = "ID";

к

public const string ColumnID = "ID";

Ответ 5

readonly

Значение поля readonly может быть изменено (в конструкторе). Вам понадобится const.

Ответ 6

Для полноты здесь приведены три допустимых значения по умолчанию для необязательного аргумента: (from: MSDN: Именованные и необязательные аргументы)

  • постоянное выражение
  • выражение формы new ValType(), где ValType - тип значения, таких как enum или struct; (обратите внимание: можно использовать только конструктор без параметров)
  • выражение формы default(ValType), где ValType - тип значения.

Ответ 7

public const string ColumnID = "ID";

Ответ 8

Попробуйте изменить это

public static readonly string ColumnID = "ID";

к

public const string ColumnID = "ID";