在此代码中:
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>
吗?
答案 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讨论了out
和ref
与参数的使用。如果您使用ref
关键字,则必须在调用方法之前设置该值。在这种情况下,我认为没有理由使用ref
关键字