C # - comment passer le paramètre 'out' dans l'expression lambda
J'ai une méthode ayant la signature suivante:
private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)
J'ai trouver la valeur associée prettyName
sur la base de la dbField
. Je veux trouver toutes les propriétés, le cas échéant, le nom prettyName
donc j'essaye de faire ce qui suit:
IEnumerable<PropertyInfo> matchingProperties =
getLocalProperties().Where(prop =>
prop.Name.Equals(prettyName)
);
Cependant, cela donne l'erreur suivante:
Ne peut pas utiliser ref ou le paramètre 'prettyName' à l'intérieur d'une méthode anonyme, expression lambda, ou une expression de requête
Par le point de la méthode où je suis en train d'utiliser prettyName
dans le Where
paramètre lambda, prettyName
est certainement initialisé. Je return
si prettyName
ne peut pas être initialisé à une valeur valide. Est-il une astuce que je pouvais faire ici pour me laisser utiliser prettyName
dans l'expression lambda?
Edit: je suis en utilisant .NET 3.5 si il le faut.
source d'informationauteur Sarah Vessels
Vous devez vous connecter pour publier un commentaire.
Que l'erreur du compilateur indique, il n'est pas autorisé à utiliser ou ref paramètres à l'intérieur des expressions lambda.
Pourquoi ne pas simplement utiliser une copie? Ce n'est pas comme le lambda veut muter la variable de toute façon, donc je ne vois pas l'inconvénient.
Alternativement, vous pouvez utiliser un local dans l'ensemble (pour évaluer le bon nom, etc.), et affecter la
out
paramètreprettyName
juste avant le retour de la méthode. Ce sera probablement plus lisible si il n'y a pas d'importantes ramifications à l'intérieur de la méthode.Juste pour clarifier. Il est possible d'utiliser ref/out arguments à partir d'une méthode appelée dans un lambda.
Vous pouvez également utiliser une ref ou si vous spécifiez le type du paramètre. Ce qui signifie l'envoi de prettyName comme un paramètre pour le lambda.
Clause where prend un seul argument, qui est la propriété de l'élément dans la liste. C'est ce qui vous empêche d'ajouter un argument pour le lambda.
Ne voulait pas laisser les gens la fausse impression que vous ne pouvez pas utiliser ces arguments dans un lambda. Vous juste ne pouvez pas les utiliser par la capture.