C# 列表<;T>;as';输出';参数导致错误。为什么?

C# 列表<;T>;as';输出';参数导致错误。为什么?,c#,list,out-parameters,C#,List,Out Parameters,在此代码中: public bool SomeMethod(out List<Task> tasks) { var task = Task.Factory.StartNew(() => Process.Start(info)); tasks.Add(task); } 是因为List?您必须初始化方法体中的out参数(即创建一个新的List实例并将其分配给out参数): C#7.0引入了新的更简单的语法,在调用函数时使用out参数声明变量: public boo

在此代码中:

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

是因为
List

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

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

public bool SomeMethod(out List<Task> tasks) {
  var task = Task.Factory.StartNew(() => Process.Start(info);
  tasks = new List<Task>() { task };
  ...
}
SomeMethod(out var tasks);
var newTask = tasks[0]; // Access the task just created.
List<Task> tasks = new List<Task>();
tasks.Add(task);
由于
列表
是通过引用传递的,因此可以去掉
out
参数。然后,您必须在调用该方法之前创建列表:

public bool SomeMethod(List<Task> tasks) {
  var task = Task.Factory.StartNew(() => Process.Start(info);
  tasks.Add(task);
  ...
}
public bool SomeMethod(列出任务){
var task=task.Factory.StartNew(()=>Process.Start(info);
任务。添加(任务);
...
}
这样称呼它:

List<Task> tasks;
SomeMethod(out tasks);
var newTask = tasks[0]; // Access the task just created.
var tasks = new List<Task>();
SomeMethod(tasks);
var newTask = tasks[0]; // Access the task just created.
var tasks=newlist();
方法(任务);
var newTask=tasks[0];//访问刚刚创建的任务。

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

您需要执行
tasks=new List()
在您可以向其中添加任务对象之前。更接近您正在执行的操作的MSDN将传递数组而不是整数。

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

public bool SomeMethod(out List<Task> tasks) {
  var task = Task.Factory.StartNew(() => Process.Start(info);
  tasks = new List<Task>() { task };
  ...
}
SomeMethod(out var tasks);
var newTask = tasks[0]; // Access the task just created.
List<Task> tasks = new List<Task>();
tasks.Add(task);
List tasks=newlist();
任务。添加(任务);

这是因为您没有为
任务
-变量赋值……在本例中,该变量将引用类型为
列表
的实例

tasks=newlist();
添加到SomeMethod的主体中,一切都会正常工作:

public bool SomeMethod(out List<Task> tasks) {
   tasks = new List<Task>();
   var task = Task.Factory.StartNew(() => Process.Start(info);
   tasks.Add(task);
}
public bool SomeMethod(列出任务){
任务=新列表();
var task=task.Factory.StartNew(()=>Process.Start(info);
任务。添加(任务);
}

您需要初始化
任务
参数。例如
任务=新列表()


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

没有充分声明它(假设您将在该方法中初始化它)例如,
List myTask=null;
设置
tasks=null;
将删除有关初始化的编译器错误,但在
tasks.Add(task)上会出现运行时错误
不,你需要设置它。这就是
out
的意思。退出SomeMethod后,原始的“任务”将有来自这个SomeMethod的项目?我问,因为现在有很多线程,不是所有线程都正常工作,所以我无法验证它。我不能通过值传递,因为我需要在更高的类中拾取所有“任务”。没有这样的线程正在按值传递
列表
。它是引用类型,而不是值类型。