使用 console.writeline 重载函数传递数组时遇到问题
having trouble using the console.writeline overload function to pass arrays
这里是初学者:
我是不是对重载函数的使用有误解?
namespace Grades
{
class Program
{
private static object mike;
private static object gus;
private static object julio;
static void Main(string[] args)
{
object[] names = new object[3];
names[1] = mike;
names[0] = gus;
names[2] = julio;
WriteAnswer(" you're cool ", names );
}
static void WriteAnswer(string description, params object[] result)
{
Console.WriteLine(description + " " + result);
}
}
}
输出:
you're cool System.Object[]
我的印象是输出将是:
you're cool gus mike julio
或:
you're cool gus
you're cool mike
you're cool julio
首先,您遇到的问题与Console.WriteLine
的重载函数无关。
相反..你正在创建object
变量但没有给它们任何值来保存,所以它们是null
..所以你当前的代码......它最终会是"you're cool "
,这是因为 命名的变量 mike
、gus
和 julio
实际上不包含任何值.
方案一
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
private static object mike = "mike"; // give the variable a value to hold
private static object gus = "gus"; // give the variable a value to hold
private static object julio = "julio"; // give the variable a value to hold
public static void Main()
{
object[] names = new object[3];
names[1] = mike;
names[0] = gus;
names[2] = julio;
WriteAnswer(" you're cool ", names);
}
static void WriteAnswer(string description, object[] result)
{
Console.WriteLine(description + string.Join(",", result));
}
}
我已经在 DotNetFiddle
中编辑了您的代码
解决方案 2
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
private static object mike = "mike"; // give the variable a value to hold
private static object gus = "gus"; // give the variable a value to hold
private static object julio = "julio"; // give the variable a value to hold
public static void Main()
{
object[] names = new object[3];
names[1] = mike;
names[0] = gus;
names[2] = julio;
WriteAnswer(" you're cool ", names);
}
static void WriteAnswer(string description, object[] result)
{
for(int i = 0; i < result.Length; i++)
{
Console.WriteLine(description + result[i]);
}
}
}
正如 M12 的回答所指出的,您永远不会为变量赋值,因此它们将始终为空。显然,必须先解决这个问题。不过要回答您的实际问题:
I was expecting : There is a case where passing an array to WriteLine prints the contents of the array
让我们对您的程序进行一些修改,然后讨论 WriteLine
的工作原理。我们将创建一个字符串数组,并初始化其内容:
string[] names = { "Gus", "Mike", "Julio" };
现在,WriteLine
我们有哪些选择?它们有什么作用?假设你有
Console.WriteLine("you're cool " + names);
会发生什么?
先分析"you're cool" + names
,判断是字符串和对象的相加,于是变成:
string temp = String.Concat("you're cool ", names.ToString());
Console.WriteLine(temp);
(旁白:不完全;你明白为什么了吗?)
现在我们必须确定 names.ToString()
的作用。它 returns 一个给出数组类型的字符串。如果您想创建一个将内容连接在一起的字符串,请使用 string.Join
.
WriteLine
的可变重载怎么样?如果我们调用
会怎样
Console.WriteLine("you're cool ", names);
适用WriteLine
的形参类型为:
(string, object)
(string, params object[])
所以有三种可能:
- 以数组为对象调用
(string, object)
。
- 调用
(string, object[])
数组作为 object[]
。 (这在 C# 中是合法的,因为 不安全的数组协方差 。)
- 以扩展形式调用
(string, object[])
:即创建一个新的object[1] {names}
并传递它。
C# 拒绝第三种选择:适用于其正常形式的可变参数方法总是优于扩展形式。
C# 拒绝第一个选项,因为 object
比 object[]
更通用。
因此 C# 调用第二个重载。现在阅读该重载的文档;鉴于提议的 格式字符串 和 格式参数?
,您认为它会做什么
这里是初学者:
我是不是对重载函数的使用有误解?
namespace Grades
{
class Program
{
private static object mike;
private static object gus;
private static object julio;
static void Main(string[] args)
{
object[] names = new object[3];
names[1] = mike;
names[0] = gus;
names[2] = julio;
WriteAnswer(" you're cool ", names );
}
static void WriteAnswer(string description, params object[] result)
{
Console.WriteLine(description + " " + result);
}
}
}
输出:
you're cool System.Object[]
我的印象是输出将是:
you're cool gus mike julio
或:
you're cool gus
you're cool mike
you're cool julio
首先,您遇到的问题与Console.WriteLine
的重载函数无关。
相反..你正在创建object
变量但没有给它们任何值来保存,所以它们是null
..所以你当前的代码......它最终会是"you're cool "
,这是因为 命名的变量 mike
、gus
和 julio
实际上不包含任何值.
方案一
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
private static object mike = "mike"; // give the variable a value to hold
private static object gus = "gus"; // give the variable a value to hold
private static object julio = "julio"; // give the variable a value to hold
public static void Main()
{
object[] names = new object[3];
names[1] = mike;
names[0] = gus;
names[2] = julio;
WriteAnswer(" you're cool ", names);
}
static void WriteAnswer(string description, object[] result)
{
Console.WriteLine(description + string.Join(",", result));
}
}
我已经在 DotNetFiddle
中编辑了您的代码解决方案 2
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
private static object mike = "mike"; // give the variable a value to hold
private static object gus = "gus"; // give the variable a value to hold
private static object julio = "julio"; // give the variable a value to hold
public static void Main()
{
object[] names = new object[3];
names[1] = mike;
names[0] = gus;
names[2] = julio;
WriteAnswer(" you're cool ", names);
}
static void WriteAnswer(string description, object[] result)
{
for(int i = 0; i < result.Length; i++)
{
Console.WriteLine(description + result[i]);
}
}
}
正如 M12 的回答所指出的,您永远不会为变量赋值,因此它们将始终为空。显然,必须先解决这个问题。不过要回答您的实际问题:
I was expecting : There is a case where passing an array to WriteLine prints the contents of the array
让我们对您的程序进行一些修改,然后讨论 WriteLine
的工作原理。我们将创建一个字符串数组,并初始化其内容:
string[] names = { "Gus", "Mike", "Julio" };
现在,WriteLine
我们有哪些选择?它们有什么作用?假设你有
Console.WriteLine("you're cool " + names);
会发生什么?
先分析"you're cool" + names
,判断是字符串和对象的相加,于是变成:
string temp = String.Concat("you're cool ", names.ToString());
Console.WriteLine(temp);
(旁白:不完全;你明白为什么了吗?)
现在我们必须确定 names.ToString()
的作用。它 returns 一个给出数组类型的字符串。如果您想创建一个将内容连接在一起的字符串,请使用 string.Join
.
WriteLine
的可变重载怎么样?如果我们调用
Console.WriteLine("you're cool ", names);
适用WriteLine
的形参类型为:
(string, object)
(string, params object[])
所以有三种可能:
- 以数组为对象调用
(string, object)
。 - 调用
(string, object[])
数组作为object[]
。 (这在 C# 中是合法的,因为 不安全的数组协方差 。) - 以扩展形式调用
(string, object[])
:即创建一个新的object[1] {names}
并传递它。
C# 拒绝第三种选择:适用于其正常形式的可变参数方法总是优于扩展形式。
C# 拒绝第一个选项,因为 object
比 object[]
更通用。
因此 C# 调用第二个重载。现在阅读该重载的文档;鉴于提议的 格式字符串 和 格式参数?
,您认为它会做什么