将<T>列为"out"参数会导致错误.为什么?

Sai*_*int 10 c# list out-parameters

在这段代码中:

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

我收到一个错误,"使用未分配的参数'任务'".为什么?

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

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

    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}
Run Code Online (Sandbox Code Playgroud)

是因为List<T>

Mar*_*age 13

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

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

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

您应该像这样调用方法:

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

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

SomeMethod(out var tasks);
var newTask = tasks[0]; // Access the task just created.
Run Code Online (Sandbox Code Playgroud)

作为a List<T>通过引用传递,您可以摆脱out参数.然后,您必须在调用方法之前创建列表:

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

并称之为:

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

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


Joh*_*ers 5

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

List<Task> tasks = new List<Task>();
tasks.Add(task);
Run Code Online (Sandbox Code Playgroud)