我试图以某种方式做到以下几点:
const char EscapeChar = '\\';
const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
这不能编译。还有其他方法可以使它发挥作用吗?
答案 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字段可以具有不同的值,具体取决于所使用的构造函数。
答案 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)