为什么写项目到控制台只写命名空间和类名而不是数据?

对于你们大多数人(熟练的程序员)而言,标题听起来可能并不是很好,但我正在学习C#基础知识的第3周,而且我无法弄清楚如何解决下一个任务。 我将为一堆城市存储一些温度,首先向用户询问cityName,然后询问该城市的实际温度。 所有这些东西都应保存在列表中,我将使用Class和Constructor。 当我尝试打印出结果(使用foreach)时,它打印出我的命名空间的名称和我的类的名称,如“Task_5.City”我的代码错误:

public class City //class { public string CityName { get; set; } public int Temperature { get; set; } public City(string name, int temp)//konstruktor { this.CityName = name; this.Temperature = temp; } } class Program { static void Main(string[] args) { var cityList = new List(); Console.WriteLine("What is your city?"); string cityName = Console.ReadLine(); Console.WriteLine("What temperature for this city?"); int temp = Convert.ToInt32(Console.ReadLine()); City myCity = new City(cityName, temp); cityList.Add(myCity); foreach (var item in cityList) { Console.WriteLine(item); } Console.ReadLine(); } } 

您正在将对象传递给Console.WriteLine(item)而不是传递字符串。 Console.WriteLine调用该对象的ToString()方法,该方法默认返回名称空间+类名。 您可以像下一样覆盖此行为:

  public class City //class { public string CityName { get; set; } public int Temperature { get; set; } public City(string name, int temp)//konstruktor { this.CityName = name; this.Temperature = temp; } public override string ToString() { return string.Format("{0} {1}", CityName, Temperature); } } 

或者您可以使用WriteLine方法的另一个重载:

 Console.WriteLine("{0} {1}", item.CityName, item.Temperature); 

更改Console.WriteLine(item); 如果您只想写出City对象的内容,请选择以下选项之一。

 Console.WriteLine("City: " + item.CityName + " has a temperature of " + item.Temperature + " degrees."); 

或者,如果您愿意,可以使用string.Format

 Console.WriteLine(string.Format("City: {0} has a temperature of {1} degrees.", item.CityName, item.Temperature)); 

cityList中的项目是City类型,这意味着您具有CityName和Temperature的属性。

你应该使用:

Console.WriteLine(item.CityName + " is at " + item.Temperature + ".");

或类似的东西。

你正在使用WriteLine这个重载:

 public static void WriteLine(object value) 

并且这个重载调用ToString方法的参数来产生它的字符串表示。 如前所述, ToString的默认实现返回类型的完全限定名称。

您可以在City类中覆盖ToString ,以便能够使用此类型的实例,其中需要一个字符串,如Console.WriteLine

 public override string ToString() { return CityName + Temperature.ToString(); // return $"{CityName} : {Temperature}"; // Or use C# string interpolation } 

或者直接生成必需的字符串并将其传递给WriteLine方法:

 Console.WriteLine($"{item.CityName} : {item.Temperature}); 

在这里,您尝试打印对象本身。 如果您想打印CityName和Temperature,在foreach内部您必须打印该属性。

 foreach (var item in cityList) { Console.WriteLine(item.CityName); Console.WriteLine(item.Temperature); } 

但在这里,你只有一个城市和温度,并打印它。 在这种情况下,为什么需要列表?