9

这个问题,我知道 aconst string可以是const事物的串联。现在,枚举只是一组连续整数,不是吗?那么为什么不能这样做:

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

或这个 :

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

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

现实生活中的例子:在构建 SQL 查询时,我想拥有"where status <> " + StatusEnum.Discarded.

4

3 回答 3

8

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

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

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

至于为什么:对于enum的情况,enum 格式化实际上是相当复杂的,尤其是对于这种[Flags]情况,所以把它留给运行时是有意义的。对于这种int情况,这仍然可能受到文化特定问题的影响,因此再次:需要推迟到运行时。编译器在这里实际生成的是一个操作,即使用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).

于 2012-04-13T09:38:36.603 回答
4

您需要使用readonlyorstatic readonly代替const.

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

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

于 2012-04-13T09:38:48.160 回答
2

你不能这样做,因为MyEnum.Value1and(int)MyEnum.Value1不是常string量值。赋值时会有隐式转换。

使用 astatic readonly string代替:

static readonly string blah = "blah " + MyEnum.Value1;
于 2012-04-13T09:39:06.897 回答