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

时间:2009-01-04 08:53:25

标签: c# string const

我试图以某种方式做到以下几点:

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

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

4 个答案:

答案 0 :(得分:8)

来自C# Language Specification(§17.3和14.16):

  

17.3常数

     

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

  

14.16常量表达式

     

常量表达式是一个表达式   应该在编译时完全评估。   表达式在哪里   这是必须的   用语法表示语法   常量表达式。   [...]   常量表达式中允许使用以下结构:

     
      
  • 文字(包括null   文字)
  •   
  • 引用类和结构类型的const成员。
  •   
  • 引用枚举类型的成员。
  •   
  • 带括号的子表达式,它们本身就是常量表达式。
  •   
  • 投射表达式,前提是目标类型是上面列出的类型之一。
  •   
  • 预定义的已检查和未选中的+, - ,!和〜一元运算符。
  •   
  • 预定义的+, - ,*,/,%,<<,>>,&,|,^,&&,||,==,!=,<,> ;,< =和> =   二元运算符,前提是每个操作数都是上面列出的类型。
  •   
  • ?:条件运算符。
  •   
  • sizeof表达式,提供了   unmanaged-type是其中一种类型   在§14.5.12。
  • 中指定   
  • 默认值   表达式,只要类型为1   上面列出的类型或类型   是引用类型或类型   已知的参数是a   参考类型(§25.7)。
  •   
     

以下   转换是允许的常量   表达式:

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

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

private static readonly EscapeString = EscapeChar.ToString();

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

这是一篇关于differences between const and readonly members的好文章。

答案 1 :(得分:5)

我没有看到任何方式这样做,我同意这有点可惜 - 但你真的需要它是const而不是{{1 }}?后者将几乎相同的语义。

答案 2 :(得分:1)

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

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

或者你可以在需要字符串版本时坚持使用char版本和ToString()它:)

答案 3 :(得分:1)

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

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

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