2010-12-10 2 views
16

Следующий код компилируется успешно:Почему я не могу использовать новую строку в отладчике?

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

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

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

Посмотреть [Это сообщение в блоге ] (http://dotnetdust.blogspot.com/2009/03/string-construtor-stringchar-value.html). – cdhowie

+1

Теперь это «исправлено» в VS 2015, я предполагаю, потому что использует Roslyn. –

ответ

23

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

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

+0

Почему существует метод NewString? Почему строки не создаются с помощью 'NewObject'? – Brian

+0

@Brian, я не знаю истории о том, почему они сделали это различие, и когда я некоторое время назад спрашивал, что нынешние разработчики кода тоже этого не сделали. – JaredPar

+3

Просто обратите внимание, что в качестве обходного пути вы можете использовать это: новый System.Text.StringBuilder(). Добавить (новый char [] {'b', 'a', 'r'})). ToString() –

Смежные вопросы