Question C # - comment passer le paramètre 'out' dans l'expression lambda


J'ai une méthode avec la signature suivante:

private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)

Dans ce document, je trouve la valeur associée prettyName basé sur le donné dbField. Je veux ensuite trouver toutes les propriétés, le cas échéant, qui ont le nom prettyName, alors j'essaie de faire ce qui suit:

IEnumerable<PropertyInfo> matchingProperties =
    getLocalProperties().Where(prop =>
        prop.Name.Equals(prettyName)
    );

Cependant, cela donne l'erreur suivante:

Impossible d'utiliser le paramètre ref ou out 'prettyName' dans une méthode anonyme, une expression lambda ou une expression de requête

Au point de la méthode où j'essaie d'utiliser prettyName dans le Where paramètre lambda, prettyName est définitivement initialisé. je return si prettyName ne peut pas être initialisé à une valeur valide. Y a-t-il un truc que je pourrais faire ici pour me laisser utiliser prettyName dans l'expression lambda?

Modifier: J'utilise .NET 3.5 si c'est important.


11
2017-10-28 18:01


origine


Réponses:


Comme l'indique l'erreur du compilateur, il est interdit d'utiliser des paramètres out ou ref dans les expressions lambda.

Pourquoi ne pas simplement utiliser une copie? Ce n'est pas comme si le lambda voulait muter la variable de toute façon, alors je ne vois pas d'inconvénient.

string prettyNameCopy = prettyName;
var matchingProperties = getLocalProperties()
                        .Where(prop => prop.Name == prettyNameCopy);

Vous pouvez également utiliser un local partout (pour évaluer le nom approprié, etc.) et attribuer outparamètre prettyName juste avant de revenir de la méthode. Cela sera probablement plus lisible s'il n'y a pas de ramifications significatives dans la méthode.


16
2017-10-28 18:04



Juste pour clarifier. Il est possible d'utiliser des arguments ref / out d'une méthode appelée dans un lambda.

Vous pouvez également utiliser un ref ou out si vous spécifiez le type du paramètre. Ce qui signifie envoyer prettyName comme paramètre à la lambda.

(prop, ref string prettyName) => prop.Name.Equals(prettyName);

Où clause ne prend qu'un seul argument, qui est l'élément de propriété dans la liste. C'est ce qui vous empêche d'ajouter un argument à la lambda.

Je ne voulais pas laisser aux gens la fausse impression de ne pas pouvoir utiliser ces arguments dans un lambda. Vous ne pouvez simplement pas les utiliser par capture.


16
2017-08-08 13:43