Liste<T> 'out' paramètre provoque une erreur. Pourquoi?
Dans ce code:
public bool SomeMethod(out List<Task> tasks)
{
var task = Task.Factory.StartNew(() => Process.Start(info));
tasks.Add(task);
}
J'obtiens une erreur, "Utilisation des indicatifs de paramètre out 'tâches'". Pourquoi?
Dans MSDN exemple, il y a une juste utilisation de out
paramètre
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
//value is now 44
}
}
C'est à cause de List<T>
?
OriginalL'auteur Saint | 2011-05-24
Vous devez vous connecter pour publier un commentaire.
Vous devez initialiser le
out
paramètre dans le corps de la méthode (c'est-à créer un nouveauList<Task>
instance et de l'affecter à laout
paramètre):Je suis en utilisant la syntaxe d'initialiseur de collection pour ajouter la tâche de la liste, mais vous pourriez l'appeler le
Add
méthode au lieu de cela, si vous préférez.Vous devez appeler la méthode comme ceci:
C# 7.0 a introduit une nouvelle syntaxe plus simple où vous déclarer la variable dans l'appel de la fonction avec l'
out
paramètre:Comme un
List<T>
est passé par référence, vous pouvez vous débarrasser de laout
paramètre. Vous avez ensuite la création de la liste avant d'appeler la méthode:Et de l'appeler comme ceci:
En général, il est de bonne pratique d'éviter
out
des paramètres, car ils peuvent être source de confusion.Je ne peux pas passer par valeur parce que j'ai besoin de ramasser tous les "tâche" à une classe supérieure
Il n'y a pas une telle chose comme passant
List<T>
en valeur. C'est un type de référence, pas un type de valeur.OriginalL'auteur Martin Liversage
out
signifie que votre méthode doit créer l'objet, puis l'affecter au paramètre:List<Task> myTask = null;
Réglage
tasks = null;
de supprimer l'erreur du compilateur concernant l'initialisation, mais vous obtiendrez une erreur d'exécution surtasks.Add(task);
Non, vous en avez besoin. C'est ce que
out
moyens.OriginalL'auteur John Saunders
C'est parce que vous n'avez pas affecter une valeur à la
tasks
-variable... dans ce cas, ce serait une référence à une instance de typeList<Task>
.Ajouter
tasks = new List<Task>();
pour le corps de SomeMethod et tout fonctionnera correctement:OriginalL'auteur Christian
Vous avez besoin d'initialiser le
tasks
paramètre. par exemple,tasks = new List<Task>()
Ce fil traite de l'utilisation de
out
etref
avec des paramètres. Si vous utilisez leref
mot-clé puis, vous devez avoir réglé la valeur avant l'appel de la méthode. Je ne vois pas de raison d'utiliser leref
mot-clé dans ce cas, bien que lesOriginalL'auteur IndigoDelta
Que vous devez faire
tasks = new List<Task>();
avant de pouvoir ajouter un objet Tâche. MSDN a un exemple qui est plus proche de ce que vous faites, cela passe un tableau plutôt qu'un int.OriginalL'auteur takrl