我可以从C#中的const char初始化一个const字符串吗?

Hos*_*Aly 7 c# string const

我试图以某种方式做以下事情:

const char EscapeChar = '\\';
const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
Run Code Online (Sandbox Code Playgroud)

这不编译.有没有其他方法可以使它工作?

spl*_*tne 8

根据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成员之间差异的好文章.


Jon*_*eet 5

我没有看到任何方式这样做,我同意这有点可惜 - 但你真的需要const而不是static readonly吗?后者将具有几乎相同的语义.


Jor*_*tos 2

从 .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)