8

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

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

这不编译。还有另一种方法可以使它工作吗?

4

4 回答 4

9

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

17.3 常数

常量是表示常量值的类成员:可以在编译时计算的值。

14.16 常量表达式

常量表达式是应在编译时完全求值的表达式。如果表达式需要是常量,则在语法中通过使用常量表达式来指示。[...]常量表达式中允许使用以下结构:

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

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

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

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

private static readonly EscapeString = EscapeChar.ToString();

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

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

于 2009-01-04T10:01:38.060 回答
6

我看不出有什么办法,我同意这有点可惜——但你真的需要它来const代替static readonly吗?后者将具有几乎相同的语义。

于 2009-01-04T08:56:21.920 回答
1

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

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

或者,只要您需要字符串版本,您就可以坚持使用 char 版本和 ToString() :)

于 2009-01-04T09:00:05.093 回答
1

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

但是,以下代码将起作用:

const char EscapeChar = '\\';
readonly string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
于 2014-12-15T13:11:51.087 回答