将<t>列为“out”参数会导致错误。为什么呢?</T>

时间:2011-05-24 13:41:12

标签: c# list out-parameters

在此代码中:

public bool SomeMethod(out List<Task> tasks)
{
    var task = Task.Factory.StartNew(() => Process.Start(info));
    tasks.Add(task);
}

我收到错误,“使用未分配的参数'任务'”。为什么呢?

在MSDN示例中,只使用out参数

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }

    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}

是因为List<T>吗?

5 个答案:

答案 0 :(得分:12)

您必须初始化方法正文中的out参数(即创建新的List<Task>实例并将其分配给out参数):

public bool SomeMethod(out List<Task> tasks) {
  var task = Task.Factory.StartNew(() => Process.Start(info);
  tasks = new List<Task>() { task };
  ...
}

我正在使用集合初始化程序语法将任务添加到列表中,但如果您愿意,可以调用Add方法。

你应该这样调用这个方法:

List<Task> tasks;
SomeMethod(out tasks);
var newTask = tasks[0]; // Access the task just created.

C#7.0引入了更简单的语法,您可以使用out参数在函数调用中声明变量:

SomeMethod(out var tasks);
var newTask = tasks[0]; // Access the task just created.

当通过引用传递List<T>时,您可以删除out参数。然后,您必须在调用方法之前创建列表:

public bool SomeMethod(List<Task> tasks) {
  var task = Task.Factory.StartNew(() => Process.Start(info);
  tasks.Add(task);
  ...
}

并称之为:

var tasks = new List<Task>();
SomeMethod(tasks);
var newTask = tasks[0]; // Access the task just created.

一般来说,最好避免使用out参数,因为它们可能会造成混淆。

答案 1 :(得分:4)

out表示您的方法需要创建对象,然后将其分配给参数:

List<Task> tasks = new List<Task>();
tasks.Add(task);

答案 2 :(得分:2)

在向其添加Task对象之前,您需要执行tasks = new List<Task>();。 MSDN has an example更接近你正在做的事情,它传递一个数组而不是一个int。

答案 3 :(得分:2)

这是因为您没有为tasks - 变量赋值......在这种情况下,它将是对List<Task>类型实例的引用。

tasks = new List<Task>();添加到SomeMethod的正文中,一切正常:

public bool SomeMethod(out List<Task> tasks) {
   tasks = new List<Task>();
   var task = Task.Factory.StartNew(() => Process.Start(info);
   tasks.Add(task);
}

答案 4 :(得分:2)

您需要初始化tasks参数。例如tasks = new List<Task>()

This thread讨论了outref与参数的使用。如果您使用ref关键字,则必须在调用方法之前设置该值。在这种情况下,我认为没有理由使用ref关键字