Hei*_*nzi 3 c# const language-lawyer
我知道我可以通过串联其他常量字符串来创建新的常量字符串:
const string a = "A";
const string ab = a + "B";
Run Code Online (Sandbox Code Playgroud)
是否可以基于常量int创建常量字符串?例如,以下内容不会编译:
const int Dpi = 300;
const string DeviceInfo = "<DeviceInfo><Dpi>" + Dpi + "</Dpi></DeviceInfo>";
Run Code Online (Sandbox Code Playgroud)
分配给MyClass.DeviceInfo的表达式必须是常量。
我知道我可以解决这个问题
Dpi一个字符串而不是一个int(并int.Parse在需要int值时添加它),DpiString(因此违反了DRY),或DeviceInfo一个static readonly字段而不是一个const字段。我将选择选项3,但是出于好奇,我想知道是否还有其他选项我错过了...
不可以,字符串常量不能是在运行时求值的表达式。
常量表达式中允许进行以下转换:
- 身份转换
- 数值转换
- 枚举转换
- 常量表达式转换
- 隐式和显式引用转换,条件是转换的源是一个常量表达式,其结果为空值。
常量表达式中不允许其他转换,包括非空值的装箱,装箱和隐式引用转换。
一个转换int到string落在未许可的“其他转换”,因为这需要对一个呼叫ToString()方法。
实际上,转换需要int.ToString()定义为使用G10数字格式的调用。这取决于当前的文化,NumberFormatInfo.NegativeSign因此原则上可以改变。我不知道有任何默认区域性,除了\u002d连字符号减号字符外,还使用其他任何形式的负号,但是如果您希望看到世界在燃烧,则可以在运行时将其设置为其他值。