我正在尝试以某种方式执行以下操作:
const char EscapeChar = '\\';
const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
这不编译。还有另一种方法可以使它工作吗?
来自C# 语言规范(§ 17.3 和 14.16):
17.3 常数
常量是表示常量值的类成员:可以在编译时计算的值。
和
14.16 常量表达式
常量表达式是应在编译时完全求值的表达式。如果表达式需要是常量,则在语法中通过使用常量表达式来指示。[...]常量表达式中允许使用以下结构:
- 文字(包括空文字)
- 对类和结构类型的 const 成员的引用。
- 对枚举类型成员的引用。
- 带括号的子表达式,它们本身就是常量表达式。
- 转换表达式,前提是目标类型是上面列出的类型之一。
- 预定义的选中和未选中、+、–、! 和 ~ 一元运算符。
- 预定义的 +、–、*、/、%、<<、>>、&、|、^、&&、||、==、!=、<、>、<= 和 >= 二元运算符,提供每个操作数属于上面列出的类型。
- ?: 条件运算符。
- sizeof 表达式,前提是非托管类型是第 14.5.12 节中指定的类型之一。
- 默认值表达式,前提是类型是上面列出的类型之一,或者类型是引用类型或已知为引用类型的类型参数(第 25.7 节)。
常量表达式中允许进行以下转换:
- 身份转换
- 数值转换
- 枚举转换
实现您想要的另一种方法是使用静态只读成员。只读成员在运行时评估,而不是在编译时评估。因此,您可以使用 ToString() 方法。
private static readonly EscapeString = EscapeChar.ToString();
注意:因为只读字段可以在类的声明或构造函数中初始化,所以只读字段可以具有不同的值,具体取决于使用的构造函数。
我看不出有什么办法,我同意这有点可惜——但你真的需要它来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)