C# - how to pass 'out' parameter into lambda expression

Sarah Vessels picture Sarah Vessels · Oct 28, 2010 · Viewed 25.7k times · Source

I have a method with the following signature:

private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)

In it, I find the associated value prettyName based on the given dbField. I then want to find all properties, if any, that have the name prettyName, so I'm trying to do the following:

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

However, this gives the following error:

Cannot use ref or out parameter 'prettyName' inside an anonymous method, lambda expression, or query expression

By the point in the method where I'm trying to use prettyName in the Where lambda parameter, prettyName is definitely initialized. I return if prettyName cannot be initialized to a valid value. Is there some trick I could do here to let me use prettyName in the lambda expression?

Edit: I'm using .NET 3.5 if it matters.

Answer

Lee Louviere picture Lee Louviere · Aug 8, 2012

Just to clarify. It's possible to use ref/out arguments from a called method in a lambda.

You can also use a ref or out if you specify type of the parameter. Which means sending prettyName as a parameter to the lambda.

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

Where clause takes in only one argument, which is the property element in the list. This is what prevents you from adding an argument to the lambda.

Didn't want to leave people the false impression that you cannot use these arguments in a lambda. You just can't use them by capture.