如何在const字符串中包含枚举值?

时间:2012-04-13 09:35:45

标签: c# string enums const

来自this question,我知道const string可以是const事物的串联。现在,一个枚举只是一组续整数,不是吗? 那么为什么不这样做呢:

const string blah = "blah " + MyEnum.Value1;

或者这个:

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

如何在const字符串中包含枚举值?

真实生活示例:在构建SQL查询时,我希望"where status <> " + StatusEnum.Discarded

3 个答案:

答案 0 :(得分:8)

作为解决方法,您可以使用字段初始值设定项而不是const,即

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

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

至于原因:对于 enum 的情况,枚举格式实际上非常复杂,特别是对于[Flags]情况,因此将它留给运行时是有意义的。对于int情况,这可能仍然可能受到特定于文化的问题的影响,所以再次:需要推迟到运行时。编译器实际生成的是 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)

答案 1 :(得分:4)

您需要使用readonlystatic readonly代替const

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

MyEnum.Value1未被视为const的原因是需要进行方法调用以将值转换为字符串,并且即使方法调用,方法调用的结果也不会被视为常量值参数是不变的。

答案 2 :(得分:2)

您无法执行此操作,因为MyEnum.Value1(int)MyEnum.Value1不是常量string值。在分配时会有隐式转换。

改为使用static readonly string

static readonly string blah = "blah " + MyEnum.Value1;
相关问题