有关带有参数的Debug.Writeline()的简单C#问题

时间:2019-02-27 20:08:42

标签: c#

在调试我的应用程序时,遇到了一个我不解的行为。我有以下

foreach (var customer in _dbContext.Customer)
{
  Debug.WriteLine("Customer Name: {0}", customer.Name);  // The output was not what I expected.
...
}

实际输出

Peter:客户名称:{0}

但是,如果我将语句重写为此。

foreach (var customer in _dbContext.Customer)
{
  Debug.WriteLine("Customer Name: " + customer.Name);  
...
}

实际输出

客户名称:Peter

我将以下代码添加到同一文件中,以查看原始代码为何无法正常工作。

string first = "Peter";
string last = "Piper";
string what = "pick";
Debug.WriteLine("1 {0} 2 {1}, 3 {0} 4 {1}, 5 {2}.", first, last, what);

实际输出

1彼得2派珀,3彼得4派珀,5顺位。

我不确定Debug.WriteLine("Customer Name: {0}", customer.Name);为什么会输出此CusPeter:Customer Name: {0}

非常感谢

2 个答案:

答案 0 :(得分:3)

由于方法的重载而发生问题。当您将string作为第二个参数传递时,它映射到以下方法:

enter image description here

如您所见,这种重载不像要在字符串中替换它们那样期待“参数”,而是等待de Debug信息的“类别”。

由于以下重载,将字符串强制转换为对象的代码有效:

enter image description here

如您所见,将字符串转换为“对象”时,它映射到WriteLine方法的另一个重载,实际上是期望将值格式化为字符串。我相信这可以回答您对它为什么在投射到对象时起作用的疑问。

答案 1 :(得分:1)

一种可行的替代方法是使用$ string interpolation

产生这个

Debug.Writline($"CustomerName {customer.Name});

我无意中在评论中回答了这个问题,但发现实际的原因得到了回答here,并且我们遇到了错误的重载,而不是插值错误。