2013-08-12 3 views
7

В C# .Net, System.Diagnostics.Debug.WriteLine имеет несколько перегруженных, включая эти два:Debug.WriteLine перегрузках, кажется, конфликтовать

//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); 

Мое намерение назвать первый с:

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

Но это что я на самом деле вызываю вторую перегрузку, потому что это более точное совпадение.

Есть ли простой способ указать, что я хочу первый?

Мои лучшие попытки до сих пор являются:

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

Но ни один из этих выглядит очень элегантно.

+4

Это прекрасный пример того, почему перегрузки всегда должны быть семантически идентичными. Если два метода имеют разные типы поведения, они должны иметь разные имена. Перегрузки прекрасно подходят для моделирования параметров по умолчанию или вариации, или если есть оптимизированные специальные случаи. Однако они всегда должны быть идентичными поведению. –

ответ

6

Попробуйте это:

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

Мое намерение состоит в том, чтобы вызвать первый с:

Первый не вызывался, поскольку упаковывают строка явной перегрузки имеет преимущество. Об этом говорит MSDN.

Параметр в синтаксисе этого метода подразумевает, что массив объектов может быть единственным значением. Исключение составляет , это объект String. Явные перегрузки имеют приоритет, поэтому значение аргумента одной строки будет по умолчанию для перегрузки Debug.WriteLine (String, String).

поэтому для того, чтобы вызвать первый, вы должны преобразовать его в объект, чтобы явная перегрузка не имела приоритета.

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

@abelenky обновил мой ответ. – Ehsan

4

Это несколько раздражает. Да, есть лучший способ. Я использую Debug.Print (docs), который имеет тот же эффект, но меньше перегрузок. Это проще, чем пытаться смотреть, когда вы можете передавать две строки до WriteLine и лить в object и меньше вводить текст тоже. Пример:

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

Вы можете не использовать перегрузку, и просто передать отформатированную строку:

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

Для ленивых TYPERS, как я, я просто использую

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

Дополнительный параметр заставляет правильную перегрузку и полностью доброкачественна.

+0

Ты ленивый типер, но ты единственный, кто написал полное пространство имен? 8) –

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