Почему я не могу использовать новую строку в отладчике? - PullRequest
16 голосов
/ 11 декабря 2010

Следующий код успешно компилируется:

string foo = new string(new char[] { 'b', 'a', 'r' });

Следующий код не может быть оценен при вставке в окно наблюдения или в окно немедленного выполнения:

new string(new char[] { 'b', 'a', 'r' });

Сообщение об ошибке:

'new string(new char[] { 'b', 'a', 'r' })' threw an exception of type 'System.ArgumentException'
    base {System.SystemException}: {"Only NewString function evaluation can create a new string."}
    Message: "Only NewString function evaluation can create a new string."
    ParamName: null

Почему это происходит?

1 Ответ

23 голосов
/ 11 декабря 2010

Средство оценки выражений C # использует интерфейсы ICorDebugEval & ICorDebugEval2 для взаимодействия с CLR во время сеанса отладки. Этот интерфейс не позволяет вызывать любой конструктор типа string. Вместо этого он заставляет все вызовы создать новый экземпляр string, чтобы пройти метод ICorDebugEval::NewString. C # EE не имеет особого случая string в EE, следовательно, он пытается вызвать конструктор напрямую и завершается неудачно.

Обратите внимание, что вы не увидите это исключение в VB.Net в Visual Studio 2010. В особых случаях он вызывает конструкторы string, оценивая аргументы и перенаправляя полученный объект string на ICorDebugEval::NewString

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...