作爲解決方法,你可以使用一個字段初始值,而不是一個常量,即
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)
。
至於爲什麼一個猜測:串聯整數可能涉及文化相關性問題。你的'int.ToString()'可能與我的'int.ToString()'不一樣。也許。只是一個猜測。特別是負數,也許。 – 2012-04-13 09:47:39
哦,對,我沒有讀過我非常仔細地鏈接的問題。所以它不僅僅是關於枚舉,實際上也不可能在const字符串中包含const整數。 – Zonko 2012-04-13 09:55:44
是的; 'const string foo =「abc」+ 1;'同樣失敗 – 2012-04-13 09:59:00