2010-12-10 19 views
16

Il seguente codice compilato correttamente:Perché non posso usare una nuova stringa nel debugger?

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

Il seguente codice non riesce a valutare se incollato nella finestra di controllo o la finestra immediata:

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

Il messaggio di errore è:

'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 

Perché succede?

+1

Sede [questo post del blog ] (http://dotnetdust.blogspot.com/2009/03/string-construtor-stringchar-value.html). – cdhowie

+1

Questo è ora "corretto" in VS 2015, sto supponendo perché usa Roslyn. –

risposta

23

L'analizzatore di espressioni C# utilizza le interfacce ICorDebugEval & ICorDebugEval2 per interagire con il CLR durante una sessione di debug. Tale interfaccia non consente la chiamata di alcun costruttore nel tipo string. Invece forza tutte le chiamate per creare una nuova istanza di string per passare attraverso il metodo ICorDebugEval::NewString. La C# EE non è un caso speciale string nell'EE, quindi tenta di chiamare direttamente la funzione di costruzione e fallisce.

Nota non si vedrà questa eccezione con VB.Net in Visual Studio 2010. Sarà caso speciale chiamate ai costruttori string valutando gli argomenti e la trasmissione della string oggetto risultante sul ICorDebugEval::NewString

+0

Perché esiste un metodo 'NewString'? Perché le stringhe non dovrebbero essere create tramite 'NewObject'? – Brian

+0

@Brian, non conosco la storia del motivo per cui hanno fatto questa distinzione e quando ho chiesto un po 'di ritardo gli attuali manutentori del codice non l'hanno fatto. – JaredPar

+3

Solo per notare, come soluzione alternativa, è possibile utilizzare questo: new System.Text.StringBuilder(). Append (new char [] {'b', 'a', 'r'})). ToString() –

Problemi correlati