2010-12-10 4 views
16

El siguiente código se compila correctamente:¿Por qué no puedo usar una nueva cadena en el depurador?

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

El siguiente código no puede ser evaluada si se pega en la ventana de inspección o la ventana Inmediato:

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

El mensaje de error es:

'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 

¿Por qué sucede esto?

+1

Ver [esta entrada del blog ] (http://dotnetdust.blogspot.com/2009/03/string-construtor-stringchar-value.html). – cdhowie

+1

Esto ahora está "arreglado" en VS 2015, supongo porque usa Roslyn. –

Respuesta

23

El evaluador de expresiones C# utiliza ICorDebugEvalICorDebugEval2 interfaces para interactuar con el CLR durante una sesión de depuración. Esa interfaz no permite la llamada de ningún constructor en el tipo string. En su lugar, obliga a todas las llamadas a crear una nueva instancia de string para pasar por el método ICorDebugEval::NewString. El C# EE no tiene un caso especial string en EE, por lo tanto, trata de llamar al constructor directamente y falla.

Nota que no verá esta excepción con VB.Net en Visual Studio 2010. Se caso especial llama a los constructores string mediante la evaluación de los argumentos y remisión de la string objeto resultante en ICorDebugEval::NewString

+0

¿Por qué hay un método 'NewString' en absoluto? ¿Por qué las cadenas no se crearían a través de 'NewObject'? – Brian

+0

@Brian, no conozco la historia de por qué hicieron esa distinción y cuando pregunté por un tiempo, los mantenedores del código actual tampoco. – JaredPar

+3

Solo para tener en cuenta, como solución alternativa, puede usar esto: new System.Text.StringBuilder(). Append (new char [] {'b', 'a', 'r'})). ToString() –

Cuestiones relacionadas