我试图以某种方式做以下事情:
const char EscapeChar = '\\';
const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
Run Code Online (Sandbox Code Playgroud)
这不编译.有没有其他方法可以使它工作?
根据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();
Run Code Online (Sandbox Code Playgroud)
注意:因为readonly字段可以在声明或类的构造函数中初始化,所以readonly字段可以具有不同的值,具体取决于所使用的构造函数.
这是一篇关于const和readonly成员之间差异的好文章.
从 .net 6.0 开始,c# 版本 10 引入了常量插值字符串(https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#constant-interpolated-strings)
因此,从 .net 6.0 开始,您可以使用以下命令来执行此操作:
const string EscapeString = $"{EscapeChar}";
Run Code Online (Sandbox Code Playgroud)