As a workaround, you can use a field initializer instead of a const, i.e.
static readonly string blah = "blah " + MyEnum.Value1; static readonly string bloh = "bloh " + (int)MyEnum.Value1;
As for why: for the enum case, enum formatting is actually pretty complex, especially for the [Flags] case, so it makes sense to leave this to the runtime. For the int case, this could still potentially be affected by culture specific issues, so again: needs to be deferred until runtime. What the compiler actually generates is a box operation here, i.e. using the string.Concat(object,object) overload, identical to:
static readonly string blah = string.Concat("blah ", MyEnum.Value1); static readonly string bloh = string.Concat("bloh ", (int)MyEnum.Value1);
where string.Concat will perform the .ToString(). As such, it could be argued that the following is slightly more efficient (avoids a box and a virtual call):
static readonly string blah = "blah " + MyEnum.Value1.ToString(); static readonly string bloh = "bloh " + ((int)MyEnum.Value1).ToString();
which would use string.Concat(string,string).
int.ToString()may not be the same as myint.ToString(). Perhaps. Just a guess. In particular, negative numbers, maybe.const string foo = "abc" + 1;fails identically