Ошибка компиляции без @ - PullRequest
       8

Ошибка компиляции без @

2 голосов
/ 01 февраля 2011

Если я сделаю это

movies = new List<string>();
movies.Add("t:\Alistair.flv");

Я получаю ошибку в VS2010

Нераспознанная escape-последовательность

Однако, когда я делаю это

movies = new List<string>();
movies.Add(@"t:\Alistair.flv");

Нет ошибки, почему?

Ответы [ 7 ]

2 голосов
/ 01 февраля 2011

Ваш первый пример:

"t:\Alistair.flv"

Здесь компилятор попытался проанализировать \A как escape-последовательность, но не может ее понять.

Второй

@"t:\Alistair.flv"

Указывает компилятору обрабатывать дословно строку, поэтому игнорируйте все escape-символы.

Этот код также будет работать, так как \\ является escape-символом для возврата:

"t:\\Alistair.flv"

Технические подробности об этом можно найти здесь .

1 голос
/ 01 февраля 2011

Из документации MSDN

Символ @ указывает конструктору строк игнорировать escape-символы и разрывы строк

Что происходит при использовании символа @компилятор будет рассматривать обратную косую черту как обратную косую черту вместо запуска специальной escape-последовательности, такой как \t.К сожалению, в вашем случае такого рода escape-последовательности не существует.

1 голос
/ 01 февраля 2011

Символ возврата \ означает, что существует специальный символ для обработки. Например. Если у вас есть \ r \ n, к строке добавится возврат каретки и новая строка.

Символ @ в основном говорит, что он должен принимать обратную косую черту как есть.

1 голос
/ 01 февраля 2011

Поскольку при использовании символа `@ 'вы говорите компилятору принимать строку как есть, вы должны знать, что никакие экранирующие символы не могут быть включены тогда.

И об ошибке

Unrecognized escape sequence

компилятор означает, что он не понимает, что вы подразумеваете под \A, поскольку он не входит в список, содержащий:

  • \\ = \
  • \n = New line character
  • \t = Tab

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

1 голос
/ 01 февраля 2011

Вы получаете ошибку из-за обратной косой черты.Вы также можете удвоить обратную косую черту, чтобы избежать обратной косой черты:

movies.Add("t:\\Alistair.flv");

См. Также ответ Джона Скита здесь:

Строковый литерал, такой как @"c:\Foo", называется дословным строковым литералом.В основном это означает, что «не применяйте никаких интерпретаций к символам, пока не будет достигнут следующий символ кавычки».Таким образом, буквальный строковый литерал может содержать обратную косую черту (без удвоения) и даже разделители строк.Чтобы получить двойные кавычки (") в дословном литерале, нужно просто удвоить его, например, @" Меня зовут "" Джон "" "представляет строку« Меня зовут »Джон. Строковые литералы дословно, которые содержат разделители строктакже будет содержать пробелы в начале строки, поэтому я не буду использовать их в тех случаях, когда пробелы имеют значение. Они очень удобны для включения XML или SQL в ваш исходный код, хотя и другое типичное использование(который не нуждается в разделителях строк) предназначен для указания пути к файловой системе.

И эта статья Джона Скита здесь:

0 голосов
/ 01 февраля 2011

Смотри здесь

http://msdn.microsoft.com/en-us/library/362314fe(v=vs.71).aspx

\ A обрабатывается как escape-последовательность (\ помечает это). Использование символа @ указывает компилятору обрабатывать символ \ как символ \, а не как начало escape-последовательности. \ A не является допустимой escape-последовательностью, следовательно, ошибка.

0 голосов
/ 01 февраля 2011

Попробуйте с

movies.Add("t:\\Alistair.flv");

Информация здесь: Использование строк в MSDN (см. «Обратный слеш»)

...