我试图以某种方式做以下事情:
const char EscapeChar = '\\'; const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
这不编译.有没有其他方法可以使它工作?
根据C#语言规范(第17.3和14.16节):
17.3常数
常量是表示常量值的类成员:可以在编译时计算的值.
和
14.16常量表达式
常量表达式是一个在编译时应完全计算的表达式.在表达式需要是常量的情况下,这通过使用常量表达式在语法中指示.[...] 常量表达式允许使用以下结构:
文字(包括空文字)
对类和结构类型的const成员的引用.
引用枚举类型的成员.
带括号的子表达式,它们本身是常量表达式.
如果目标类型是上面列出的类型之一,则转换表达式.
预定义的已检查和未选中的+, - ,!和〜一元运算符.
预定义的+, - ,*,/,%,<<,>>,&,|,^,&&,||,==,!=,<,>,<=和> =二元运算符,每个都提供操作数是上面列出的类型.
?:条件运算符.
sizeof表达式,前提是unmanaged-type是§14.5.12中指定的类型之一.
默认值表达式,前提是类型是上面列出的类型之一,或者类型是引用类型或已知为引用类型的类型参数(第25.7节).
常量表达式允许以下转换:
身份转换
数字转换
枚举转换
实现您想要的另一种方法是使用静态只读成员.Readonly成员在运行时进行评估,而不是在编译时进行评估.因此,您可以使用ToString()方法.
private static readonly EscapeString = EscapeChar.ToString();
注意:因为readonly字段可以在声明或类的构造函数中初始化,所以readonly字段可以具有不同的值,具体取决于所使用的构造函数.
这是一篇关于const和readonly成员之间差异的好文章.
我没有看到任何方式这样做,我同意这有点可惜 - 但你真的需要它const
而不是static readonly
吗?后者将具有几乎相同的语义.