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的项目?我问,因为现在有很多线程,不是所有线程都正常工作,所以我无法验证它。我不能通过值传递,因为我需要在更高的类中拾取所有“任务”。没有这样的线程正在按值传递列表
。它是引用类型,而不是值类型。