Por que o Debug.WriteLine formata incorretamente cadeias de caracteres?

Eu tenho o seguinte Debug.WriteLine :

 Debug.WriteLine("Metadata Version: {0}", version); // update: version is a string 

A saída é:

2.0: versão dos metadados: {0}

Por que a string é formatada dessa maneira?

Eu não vi nada na documentação do MSDN que identifica o raciocínio por trás desse formato. Eu tenho que fazer o seguinte para obter uma saída corretamente formatada:

 Debug.WriteLine(string.Format("Metadata Version: {0}", version)); 

Como a version é uma string , você está atingindo a sobrecarga de WriteLine que aceita uma categoria como seu segundo parâmetro.

Embora haja vários hacks para contornar esse comportamento (includeei alguns abaixo, por diversão), eu pessoalmente preferiria sua solução como a maneira preferível de garantir claramente que a string seja tratada como uma string de formatação.

Algumas outras soluções alternativas hacky:

 Debug.WriteLine("Metadata Version: {0}", version, ""); Debug.WriteLine("Metadata Version: {0}", (object)version); Debug.WriteLine("Metadata Version: {0}", new[] { version }); Debug.WriteLine("Metadata Version: {0}", version, null); 

Como sua version é string, ela está usando a sobrecarga do método Debug.WriteLine (String, String) .

Você pode fazer algumas coisas para obter o resultado certo:

 Debug.WriteLine("Metadata Version: {0}",(object) version); 

Ou você pode usar o Debug.Print

 Debug.Print("Metadata Version: {0}", version); 

Ele está resolvendo sua chamada de método para essa sobrecarga de Debug.WriteLine , que recebe uma string de mensagem como seu primeiro parâmetro e uma string de categoria como o segundo parâmetro.

Se você converter o parâmetro de versão para System.Object, ele será resolvido para a sobrecarga desejada de Debug.WriteLine , que usa uma string de formato como seu primeiro parâmetro e um ou mais objects como parâmetros subseqüentes.

 Debug.WriteLine("Metadata Version: {0}", (object)version);