我可以通过在C#中串联字符串和整数常量来创建字符串常量吗?

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的表达式必须是常量。

我知道我可以解决这个问题

  1. 制作Dpi一个字符串而不是一个int(并int.Parse在需要int值时添加它),
  2. 添加第二个字符串常量DpiString(因此违反了DRY),或
  3. 制作DeviceInfo一个static readonly字段而不是一个const字段。

我将选择选项3,但是出于好奇,我想知道是否还有其他选项我错过了...

Ben*_*Ben 5

不可以,字符串常量不能是在运行时求值的表达式。

常量表达式中允许进行以下转换:

  • 身份转换
  • 数值转换
  • 枚举转换
  • 常量表达式转换
  • 隐式和显式引用转换,条件是转换的源是一个常量表达式,其结果为空值。

常量表达式中不允许其他转换,包括非空值的装箱,装箱和隐式引用转换。

一个转换intstring落在未许可的“其他转换”,因为这需要对一个呼叫ToString()方法。

实际上,转换需要int.ToString()定义为使用G10数字格式的调用。这取决于当前的文化,NumberFormatInfo.NegativeSign因此原则上可以改变。我不知道有任何默认区域性,除了\u002d连字符号减号字符外,还使用其他任何形式的负号,但是如果您希望看到世界在燃烧,则可以在运行时将其设置为其他值。