来自this question,我知道const string
可以是const
事物的串联。现在,一个枚举只是一组续整数,不是吗?
那么为什么不这样做呢:
const string blah = "blah " + MyEnum.Value1;
或者这个:
const string bloh = "bloh " + (int)MyEnum.Value1;
如何在const字符串中包含枚举值?
真实生活示例:在构建SQL查询时,我希望"where status <> " + StatusEnum.Discarded
。
答案 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)
您需要使用readonly
或static 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;