【发布时间】:2014-02-26 11:07:20
【问题描述】:
快速提问。为什么下面的两行都有效?
char x = '\"';
char y = '"';
如果"是特殊字符,第二行不应该标记为不正确吗?
【问题讨论】:
-
除了第一种情况外,第二种情况下可能是什么?
-
C# 没有“特殊字符”的概念。
标签: c# char special-characters
快速提问。为什么下面的两行都有效?
char x = '\"';
char y = '"';
如果"是特殊字符,第二行不应该标记为不正确吗?
【问题讨论】:
标签: c# char special-characters
如果"是特殊字符,第二行不应该标记为不正确吗?
不,因为语言规则不要求 " 在字符文字内转义,只在字符串文字内转义。
然而,允许它以任何一种方式被转义是一致的。这样就有一组同时适用于字符和字符串文字的转义序列,尽管\U........ 对于任何不是由单个 UTF-16 代码单元表示的代码点都会失败。
区别在于 C# 规范(字符串文字)的第 2.4.4.5 节,其中 single-regular-string-literal-character 产生式是:
除 " (U+0022)、\ (U+005C) 和 换行符之外的任何字符
与第 2.4.4.4 节(字符文字)相比,单字符产生式是:
除 ' (U+0027)、\ (U+005C) 和 换行符
之外的任何字符
如您所见,' 与您的情况相反:
string x = "'";
string y = "\'";
Console.WriteLine(x == y); // Strings are equivalent
【讨论】:
只有当纯值不明确时才需要转义序列。转义序列是一种说法:编译器,出于语法理解的目的而忽略它。把它当作纯值。
String s = """; //It would be unclear for the Compiler where the String ends and what is part of it. Hence Escape Sequencs are needed
char c = '"'; //It is clear where the Char starts and ends (the single Quotes).
char c = '''; //again unclear what of those is the Char. Escape Sequence needed.
【讨论】: