必须在控制离开当前方法之前分配out参数

PoV*_*oVa 4 c#

我是一个非常新的C#,这是我第一次使用列表做任何事情,所以这可能是一个非常愚蠢的问题......我正在尝试将文件中的数据读取到由Tourist对象组成的列表中.据我所知,我需要tourists在添加对象之前将一些内容分配给列表,但我不知道该怎么做.

class Tourist
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public double Contributed { get; set; }

    public Tourist(string firstName, string lastName, double money)
    {
        FirstName = firstName;
        LastName = lastName;
        Contributed = money * 0.25;
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<Tourist> tourists = new List<Tourist>();

        ReadData(out tourists);
    }

    static void ReadData(out List<Tourist> tourists)
    {
        const string Input = "..\\..\\Duomenys.txt";

        string[] lines = File.ReadAllLines(Input);
        foreach (string line in lines)
        {
            string[] values = line.Split(';');
            string firstName = values[0];
            string lastName = values[1];
            double money = Double.Parse(values[2]);
            tourists.Add(new Tourist(firstName, lastName, money));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ogt 5

通过声明一个参数,out你"保证"调用者(和编译器)你的方法为该参数的参数提供的变量设置一个值.

因为您承诺,所以通过方法的每个路径都必须为此参数指定一个值.

你的方法并没有指定值tourists.如果使用引用调用方法,这实际上可能导致NullReferenceExceptionat .tourists.Add(...)null

对我来说,似乎可以ommit的out为你初始化关键字tourists已经在Main.需要注意的是ReadData只修改了列表的内容,而不是参考存储在它tourists的变量.由于您不想更改该引用(变量的值),因此您不需要out关键字.

如果要ReadData初始化它,则需要添加该行

tourists = new List<Tourist>()
Run Code Online (Sandbox Code Playgroud)

ReadData 之前foreach循环.


正如您的代码所代表的那样,更好的解决方案是省略任何参数ReadData,让方法返回列表:

static List<Tourist> ReadData()
{
    // create list
    List<Tourist> tourists = new List<Tourist>();

    const string Input = "..\\..\\Duomenys.txt";       

    string[] lines = File.ReadAllLines(Input);
    foreach (string line in lines)
    {
        // shortened for brevity
        tourists.Add(new Tourist(firstName, lastName, money));
    }

    return tourists; // return newly created list
}
Run Code Online (Sandbox Code Playgroud)

并使用Main如下:

static void Main(string[] args)
{
    List<Tourist> tourists = ReadData();
}
Run Code Online (Sandbox Code Playgroud)