2011-05-24 13 views
9

En este código:La lista <T> como parámetro 'out' provoca un error. ¿Por qué?

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

consigo un error, "Uso de parámetro asignado a cabo tareas ''". ¿Por qué?

En un ejemplo de MSDN Hay sólo tiene que utilizar el parámetro de out

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

    static void Main() 
    { 
     int value; 
     Method(out value); 
     // value is now 44 
    } 
} 

¿Es debido a List<T>?

Respuesta

11

debe inicializar el parámetro out en el cuerpo del método (es decir crear una nueva instancia List<Task> y asignarlo al parámetro out):

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

estoy usando la sintaxis colección inicializador para añadir el tarea a la lista, pero puede llamar al método Add en su lugar, si lo prefiere.

Debe llamar al método como este:

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

Si realmente desea crear la lista antes de llamar al método simplemente quitar el out:

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

y lo llaman así:

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

En general, es una buena práctica para evitar out parámetros porque pueden ser confusos.

+0

Y después de salir SomeMethod 'tareas' originales tendrá elementos de este SomeMethod?Lo pregunto porque hay muchos hilos en este momento, no todos funcionan correctamente, así que no puedo verificarlo – Saint

+0

No puedo pasar de valor porque necesito recoger toda la "tarea" en una clase superior – Saint

+0

No existe tal cosa como pasando 'List ' por valor. Es un tipo de referencia, no un tipo de valor. –

2

Debe hacer tasks = new List<Task>(); antes de poder agregarle un objeto Tarea. MSDN has an example que está más cerca de lo que estás haciendo, esto pasa una matriz en lugar de una int.

4

out significa que su método necesita para crear el objeto, a continuación, asignar al parámetro:

List<Task> tasks = new List<Task>(); 
tasks.Add(task); 
+0

¿No lo declara suficiente? (Dado que lo inicializará en el método), p. 'List myTask = null;' – Albireo

+0

Configurando 'tasks = null;' eliminaría el error del compilador con respecto a la inicialización, pero obtendría un error de tiempo de ejecución en 'tasks.Add (task);' – takrl

+0

No, debe configurar eso. Eso es lo que significa "salir". –

2

Es porque no se asigna un valor a la tasks -Variable ... en este caso que Sería una referencia a una instancia del tipo List<Task>.

Añadir tasks = new List<Task>(); al cuerpo de SomeMethod y todo funcionará bien:

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

Usted necesita para inicializar el parámetro tasks. p.ej. tasks = new List<Task>()

This thread se analiza el uso de out y ref con los parámetros. Si usa la palabra clave ref, debe haber establecido el valor antes de llamar al método. No veo ninguna razón para usar la palabra clave ref en este caso, aunque

Cuestiones relacionadas