11

在这段代码中:

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>?

4

5 回答 5

16

您必须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.

由于 aList<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参数是一种很好的做法,因为它们可能会造成混淆。

于 2011-05-24T13:43:29.997 回答
4

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

List<Task> tasks = new List<Task>();
tasks.Add(task);
于 2011-05-24T13:43:49.833 回答
2

这是因为您没有为tasks-variable... 赋值,在这种情况下,这将是对 type 实例的引用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);
}
于 2011-05-24T13:45:16.520 回答
2

您需要先执行此操作tasks = new List<Task>();,然后才能向其中添加 Task 对象。MSDN有一个更接近你正在做的例子,它传递一个数组而不是一个 int。

于 2011-05-24T13:43:35.260 回答
2

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

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

于 2011-05-24T13:47:12.183 回答