Вопрос по c#, string – Как включить значение enum в константную строку?

7

отэтот вопросЯ знаю чтоconst string может быть объединениеconst вещи. Теперь enum - это просто набор целых чисел, не так ли? Так почему же это не так?

<code>const string blah = "blah " + MyEnum.Value1;
</code>

или это :

<code>const string bloh = "bloh " + (int)MyEnum.Value1;
</code>

И как бы вы включили значение enum в константную строку?

Пример из реальной жизни: при создании запроса SQL я хотел бы иметь"where status <> " + StatusEnum.Discarded.

да;const string foo = "abc" + 1; одинаково терпит неудачу Marc Gravell♦
о, верно, я не очень внимательно прочитал вопрос, который связал. Так что речь идет не только о перечислениях, на самом деле невозможно также включить константные целые числа в константную строку. Zonko
Как предположение, почему: объединение целых чисел может включать проблемы зависимости от культуры. Вашint.ToString() не может быть таким же, как мойint.ToString(), Может быть. Просто предположение. В частности, отрицательные числа, может быть. Marc Gravell♦

Ваш Ответ

3   ответа
4

readonly или жеstatic readonly вместоconst.

static readonly string blah = "blah " + MyEnum.Value1;

Причина MyEnum.Value1 не рассматривается какconst является то, что вызов метода требуется для преобразования значения в строку, и результат вызова метода не обрабатывается как постоянное значение, даже если аргументы метода являются постоянными.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Zonko
Error: User Rate Limit ExceededboxesError: User Rate Limit Exceededstring.Concat(object,object); the compilerError: User Rate Limit Exceeded.ToString()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededint32.ToString()Error: User Rate Limit Exceeded
2

MyEnum.Value1 а также(int)MyEnum.Value1 не постоянныstring ценности. Там будет неявное преобразование во время назначения.

Использоватьstatic readonly string вместо:

static readonly string blah = "blah " + MyEnum.Value1;
8

workaroundВы можете использовать инициализатор поля вместо const, т.е.

static readonly string blah = "blah " + MyEnum.Value1;

static readonly string bloh = "bloh " + (int)MyEnum.Value1;

Что касается почему: дляenum В этом случае форматирование enum на самом деле довольно сложное, особенно для[Flags] случай, поэтому имеет смысл оставить это во время выполнения. Дляint В этом случае на это все еще могут повлиять специфические для культуры проблемы, так что еще раз: необходимо отложить до времени выполнения. ой компиляторactually генерирует этоbox операция здесь, т.е. с использованиемstring.Concat(object,object) перегрузка, идентичная:

static readonly string blah = string.Concat("blah ", MyEnum.Value1);
static readonly string bloh = string.Concat("bloh ", (int)MyEnum.Value1);

гдеstring.Concat будет выполнять.ToString(), Таким образом, можно утверждать, что следующее несколько более эффективно (избегает коробки и виртуального вызова):

static readonly string blah = "blah " + MyEnum.Value1.ToString();
static readonly string bloh = "bloh " + ((int)MyEnum.Value1).ToString();

который бы использовалstring.Concat(string,string).

Error: User Rate Limit Exceeded

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