我正在尝试以某种方式执行以下操作:
const char EscapeChar = '\\';
const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
这不能编译。还有其他方法可以让它发挥作用吗?
来自 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 成员之间的差异 的好文章。
我看不到任何方法可以做到这一点,我同意这有点可惜 - 但你真的需要它是
const
而不是static readonly
吗?后者将具有几乎相同的语义。
我能想到的唯一方法(都不理想)是:
const string EscapeString = "\\";
private static readonly EscapeString = EscapeChar.ToString();
或者您可以坚持使用 char 版本,并在需要字符串版本时使用 ToString() :)
C#.Net const 要求在编译时初始化其值。 这就是原因,您的代码无法编译。 您可以使用只读字段来分配运行时间值。
但是,以下代码可以工作:
const char EscapeChar = '\\';
readonly string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
从.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}";