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

问题描述 投票:0回答:5

我正在尝试以某种方式执行以下操作:

const char EscapeChar = '\\';
const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)

这不能编译。还有其他方法可以让它发挥作用吗?

c# string constants
5个回答
9
投票

来自 C# 语言规范(第 17.3 和 14.16 节):

17.3 常数

常量是一个类成员,它 代表一个常数值:一个值 可以在编译时计算。

14.16 常量表达式

常量表达式是一个表达式 应该在编译时进行充分评估。 表达式在哪里 需要保持不变,这是 在语法中通过使用表示 常量表达式。 [...] 常量表达式中允许使用以下结构:

  • 文字(包括 null 字面意思)
  • 对类和结构类型的 const 成员的引用。
  • 对枚举类型成员的引用。
  • 带括号的子表达式,它们本身就是常量表达式。
  • 强制转换表达式,前提是目标类型是上面列出的类型之一。
  • 预定义的选中和未选中、+、–、! 和 ~ 一元运算符。
  • 预定义的 +、–、*、/、%、<<, >>、&、|、^、&&、||、==、!=、<, >、<=, and >= 二元运算符,前提是每个操作数都属于上面列出的类型。
  • ?: 条件运算符。
  • sizeof 表达式,前提是 非托管类型是其中一种类型 §14.5.12 中指定。
  • 默认值 表达式,前提是类型为一 上面列出的类型,或者类型 是引用类型还是类型 已知参数是 参考类型(第 25.7 节)。

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

  • 身份转换
  • 数字转换
  • 枚举转换

实现您想要的效果的另一种方法是使用静态只读成员。只读成员在运行时评估,而不是在编译时评估。因此您可以使用 ToString() 方法。

private static readonly EscapeString = EscapeChar.ToString();

注意: 因为只读字段可以在类的声明处或构造函数中初始化,所以只读字段可以具有不同的值,具体取决于所使用的构造函数

这是一篇关于 const 和 readonly 成员之间的差异 的好文章。


6
投票

我看不到任何方法可以做到这一点,我同意这有点可惜 - 但你真的需要它是

const
而不是
static readonly
吗?后者将具有几乎相同的语义。


1
投票

我能想到的唯一方法(都不理想)是:

const string EscapeString = "\\";
private static readonly EscapeString = EscapeChar.ToString();

或者您可以坚持使用 char 版本,并在需要字符串版本时使用 ToString() :)


1
投票

C#.Net const 要求在编译时初始化其值。 这就是原因,您的代码无法编译。 您可以使用只读字段来分配运行时间值。

但是,以下代码可以工作:

const char EscapeChar = '\\';
readonly string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)

0
投票

从.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}";
© www.soinside.com 2019 - 2024. All rights reserved.