使用 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 ",这是因为 命名的变量 mikegusjulio 实际上不包含任何值.


方案一

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]);
        }

    }
}

DotNetFiddle.

正如 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[])

所以有三种可能:

  1. 以数组为对象调用(string, object)
  2. 调用 (string, object[]) 数组作为 object[]。 (这在 C# 中是合法的,因为 不安全的数组协方差 。)
  3. 以扩展形式调用(string, object[]):即创建一个新的object[1] {names}并传递它。

C# 拒绝第三种选择:适用于其正常形式的可变参数方法总是优于扩展形式。

C# 拒绝第一个选项,因为 objectobject[] 更通用。

因此 C# 调用第二个重载。现在阅读该重载的文档;鉴于提议的 格式字符串格式参数?

,您认为它会做什么