Быстрый вопрос. Почему обе строки ниже действительны?

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

Если "- специальный символ, разве вторая строка не должна быть помечена как неправильная?"

3
Tarec 26 Фев 2014 в 15:07
1
Что могло быть во втором случае, кроме первого?
 – 
Dirk
26 Фев 2014 в 15:08
В C # нет понятия «специальный символ».
 – 
Konrad Rudolph
26 Фев 2014 в 15:10

2 ответа

Лучший ответ

Если "- специальный символ, разве вторая строка не должна быть помечена как неправильная?"

Нет, потому что правила языка не требуют экранирования " внутри символьного литерала, только внутри строкового литерала.

Однако в любом случае рекомендуется разрешить его экранировать. Таким образом, существует один набор управляющих последовательностей, который применяется как к символьным, так и к строковым литералам, хотя \U........ не сработает для любой кодовой точки, которая не представлена ​​одной единицей кода UTF-16.

Разница заключается в разделе 2.4.4.5 спецификации C # (строковые литералы), где одиночный-обычный-строковый-буквальный-символ :

Любой символ, кроме "(U + 0022), \ (U + 005C) и символа новой строки

По сравнению с разделом 2.4.4.4 (символьные литералы), где односимвольное производство:

Любой символ, кроме '(U + 0027), \ (U + 005C) и символа новой строки

Как видите, для ' ситуация противоположная:

string x = "'";
string y = "\'";
Console.WriteLine(x == y); // Strings are equivalent
14
Jon Skeet 26 Фев 2014 в 15:09

Вам нужна только escape-последовательность, когда чистое значение будет неоднозначным. Escape Sequence - это способ сказать: компилятор, игнорируйте его для понимания синтаксиса. Примите это как чистую ценность.

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.
3
Christopher 26 Фев 2014 в 15:14