使用console.writeline重载函数传递数组时遇到问题

时间:2018-08-22 18:20:41

标签: c# .net overloading console.writeline

初学者在这里:

我误解了重载函数的使用?

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

2 个答案:

答案 0 :(得分:3)

正如M12的答案所指出的那样,您永远不会为变量分配值,因此它们始终为null。显然,这必须首先解决。不过,要回答您的实际担忧:

  

我期望:在某些情况下,将数组传递给WriteLine会打印数组的内容

让我们对您的程序进行一些修改,然后讨论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()的作用。它返回一个给出数组类型的字符串。如果要创建一个将内容连接在一起的字符串,请使用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#调用第二个重载。现在,请阅读有关该过载的文档。给定建议的 format字符串 format参数,您认为它将做什么?

答案 1 :(得分:1)

首先,您遇到的问题与Console.WriteLine的重载功能无关。

相反,您正在创建object变量,但没有给它们提供任何要保留的值,所以它们是null ..因此,以您当前的代码...它将最终以{{ 1}},就是这样,因为命名 "you're cool "mikegus的变量实际上不包含任何值。


解决方案一

julio

我已经在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)
    {
            Console.WriteLine(description + string.Join(",", result));
    }
}

DotNetFiddle