为什么字符 '\"' 和字符 '"' 一样?

3

快速问题。为什么下面两行都是有效的?

char x = '\"';
char y = '"';

如果 " 是一个特殊字符,那么第二行不应该被标记为不正确吗?

1
除了第一种情况,第二种情况可能会有什么不同? - Dirk
C# 没有“特殊字符”的概念。 - Konrad Rudolph
2个回答

14
如果 " 是一个特殊字符,第二行为什么不被标记为错误?
不需要,因为这个语言的规则只要求在字符串字面量中转义 ",而不是在字符字面量中。
但是,允许两种情况下都转义 " 是一致的。这样就有了一组适用于字符和字符串字面量的转义序列,尽管 \U........ 对于任何由多个 UTF-16 代码单元表示的代码点都会失败。
区别在于 C# 规范的第 2.4.4.5 节(字符串字面量)中,“single-regular-string-literal-character” 生产式为:
除了 "(U+0022)、\(U+005C)和换行符之外的任意字符
与第 2.4.4.4 节(字符字面量)中“single-character”生产式相比:
除了 '(U+0027)、\(U+005C)和换行符之外的任意字符
如您所见,对于 ',情况相反:
string x = "'";
string y = "\'";
Console.WriteLine(x == y); // Strings are equivalent

3

只有当纯值会产生歧义时,才需要使用转义序列。 转义序列是一种表达方式:编译器,请忽略其中一个字符以便于语法理解。将其视为纯值。

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接