Debug.WriteLine的重载似乎存在冲突。

7
在C#.Net中,System.Diagnostics.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
这是一个很好的例子,说明为什么函数重载应该在语义上完全相同。如果两个方法有不同的行为,它们应该有不同的名称。函数重载可以用来模拟默认或可变参数,或者优化特殊情况。然而,它们在行为上应该始终保持一致。 - Kennet Belenky
5个回答

6

试试这个:

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

4

这有点令人烦恼。是的,有更好的方法。我使用Debug.Print文档),它具有相同的效果,但少了一些重载。比起试图找出何时可能会传递两个字符串到WriteLine并转换为object,以及输入更少的内容。例如:

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

1
您可以避免使用过载,只需传递格式化的字符串即可:
Debug.WriteLine(string.Format("The path is {0}", myObj.myPath));

1
对于像我这样的懒惰打字者,我只使用

标签。

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

额外的参数可以强制使用正确的重载版本,而且完全无害。

你是个"懒打字的人"但你是唯一一个写完全限定命名空间的人吗?8) - Dave Cousineau

0
我的意图是使用以下方式调用第一个:
由于字符串显式重载优先,因此第一个未被调用。这就是MSDN对此的说法。
该方法语法中的params关键字意味着对象数组可以是单个值。唯一的例外是String对象。显式重载具有优先权,因此单个字符串的arg值将默认为Debug.WriteLine(String, String)重载。
因此,为了调用第一个,您必须将其转换为对象,以便显式重载不会优先。
Debug.WriteLine("The path is {0}", (object)myObj.myPath);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接