9

この質問から、私はaが物事const stringの連結である可能性があることを知っています。constさて、列挙型は単なるcont整数のセットですよね?では、なぜこれを行っても大丈夫ではないのですか?

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;

理由については、列挙型の場合、特に列挙型のフォーマットは実際にはかなり複雑な[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

の代わりにreadonlyまたはを使用する必要があります。static readonlyconst

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

MyEnum.Value1が扱われない理由はconst、値を文字列に変換するためにメソッド呼び出しが必要であり、メソッド引数が定数であっても、メソッド呼び出しの結果が定数値として扱われないためです。

于 2012-04-13T09:38:48.160 に答える
2

とは定数値MyEnum.Value1ではないため、これを行うことはできません。割り当て時に暗黙の変換が行われます。(int)MyEnum.Value1string

static readonly string代わりに使用してください:

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