2013-08-12 13 views
7

In C# .Net, System.Diagnostics.Debug.WriteLine ha diversi overload, tra questi due:sovraccarichi Debug.WriteLine sembrano essere in conflitto

//http://msdn.microsoft.com/en-us/library/cc190153.aspx 
public static void WriteLine(string format, params Object[] args); 

//http://msdn.microsoft.com/en-us/library/1w33ay0x.aspx 
public static void WriteLine(string message, string category); 

La mia intenzione è quella di chiamare il primo con:

Debug.WriteLine("The path is {0}", myObj.myPath); 

Ma sembra che in realtà sto chiamando il secondo sovraccarico, perché è una corrispondenza più esatta.

C'è un modo semplice per indicare che voglio il primo?

miei migliori tentativi finora sono:

Debug.WriteLine("The path is {0}", new object[]{myObj.myPath}); 
Debug.WriteLine("The path is {0}", myObj.myPath, ""); 

Ma nessuno di questi sembra molto elegante.

+4

Questo è un esempio d'oro del perché i sovraccarichi dovrebbero essere sempre semanticamente identici. Se due metodi hanno comportamenti diversi, dovrebbero avere nomi diversi. I sovraccarichi vanno bene per simulare i parametri di default o variadic, o se ci sono casi speciali ottimizzati. Tuttavia, dovrebbero sempre essere identici nel comportamento. –

risposta

6

Prova questo:

Debug.WriteLine("The path is {0}", (object)myObj.myPath); 
0

La mia intenzione è quella di chiamare il primo con:

La prima non è sempre chiamato, perché in caso di sovraccarico stringa esplicita la precedenza. Questo è ciò che MSDN ha da dire al riguardo.

Il parametro paramskey nella sintassi per questo metodo implica che l'array di oggetti può essere un singolo valore. L'eccezione a è l'oggetto String. I sovraccarichi espliciti hanno la precedenza, quindi un valore di argo di una singola stringa verrà impostato automaticamente sull'overload di Debug.WriteLine (String, String).

così in modo da chiamare il primo è necessario convertirlo in oggetto in modo che il sovraccarico esplicito non abbia la precedenza.

Debug.WriteLine("The path is {0}", (object)myObj.myPath); 
+0

@abelenky ha aggiornato la mia risposta. – Ehsan

4

Questo è un po 'fastidioso. Sì, c'è un modo migliore. Io uso Debug.Print (docs) che ha lo stesso effetto ma meno sovraccarichi. È più facile che cercare di guardare quando potresti passare due stringhe a WriteLine e trasmettere a object e digitare meno. Esempio:

Debug.Print("The path is {0}", myObj.myPath); 
1

Si potrebbe evitare di usare il sovraccarico, e solo passare la stringa formattata:

Debug.WriteLine(string.Format("The path is {0}", myObj.myPath)); 
1

Per typers pigri, come me, mi basta usare

System.Diagnostics.Debug.Writeline("Hello {0}", "World", 1); 

Il parametro in più forza il sovraccarico corretto ed è completamente innocuo.

+0

Sei un "pigro typer" ma sei l'unico che ha scritto lo spazio dei nomi completo? 8) –

Problemi correlati