C# - 如何将'out'参数传递给lambda表达式

Sar*_*els 12 c# linq lambda out-parameters

我有一个带有以下签名的方法:

private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)
Run Code Online (Sandbox Code Playgroud)

在其中,我prettyName根据给定的值找到相关值dbField.然后,我想要查找具有该名称的所有属性(如果有)prettyName,因此我尝试执行以下操作:

IEnumerable<PropertyInfo> matchingProperties =
    getLocalProperties().Where(prop =>
        prop.Name.Equals(prettyName)
    );
Run Code Online (Sandbox Code Playgroud)

但是,这会产生以下错误:

不能在匿名方法,lambda表达式或查询表达式中使用ref或out参数'prettyName'

通过我试图prettyNameWherelambda参数中使用的方法中的点,prettyName肯定是初始化的.我return如果prettyName无法初始化为有效值.我可以在这里做一些技巧让我prettyName在lambda表达式中使用吗?

编辑:如果重要的话,我正在使用.NET 3.5.

Ani*_*Ani 18

正如编译器错误所指示的那样,不允许在lambda表达式中使用out或ref参数.

为什么不直接使用副本?这并不像lambda想要改变变量,所以我没有看到一个缺点.

string prettyNameCopy = prettyName;
var matchingProperties = getLocalProperties()
                        .Where(prop => prop.Name == prettyNameCopy);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用整个本地(以评估适当的名称等),并在从方法返回之前分配out参数prettyName.如果方法中没有明显的分支,这可能会更具可读性.


Lee*_*ere 18

只是为了澄清.可以在lambda中使用来自被调用方法的ref/out参数.

如果指定参数类型,也可以使用ref或out.这意味着将prettyName作为参数发送到lambda.

(prop, ref string prettyName) => prop.Name.Equals(prettyName);
Run Code Online (Sandbox Code Playgroud)

Where子句只接受一个参数,即列表中的属性元素.这是阻止您向lambda添加参数的原因.

不想让人们误以为你不能在lambda中使用这些参数.你不能通过捕获来使用它们.