[英]How to pass 'out' parameter into lambda expression
我有一个具有以下签名的方法:
private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)
在其中,我根据给定的dbField
prettyName
然后,我想查找名称为prettyName
的所有属性(如果有),因此我尝试执行以下操作:
IEnumerable<PropertyInfo> matchingProperties =
getLocalProperties().Where(prop =>
prop.Name.Equals(prettyName)
);
但是,这会产生以下错误:
不能在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数“prettyName”
在我尝试在Where
lambda 参数中使用prettyName
的方法中, prettyName
肯定已被初始化。 如果prettyName
无法初始化为有效值,我会return
。 我可以在这里做一些技巧来让我在 lambda 表达式中使用prettyName
吗?
编辑:如果重要的话,我正在使用 .NET 3.5。
只是为了澄清。 可以在 lambda 中使用来自被调用方法的 ref/out 参数。
如果指定参数的类型,也可以使用 ref 或 out。 这意味着将 prettyName 作为参数发送给 lambda。
(prop, ref string prettyName) => prop.Name.Equals(prettyName);
Where 子句只接受一个参数,即列表中的属性元素。 这就是阻止您向 lambda 添加参数的原因。
不想给人们留下无法在 lambda 中使用这些参数的错误印象。 您只是不能通过捕获来使用它们。
正如编译器错误所示,不允许在 lambda 表达式中使用 out 或 ref 参数。
为什么不直接使用副本? 无论如何,lambda 都不想改变变量,所以我看不出有什么缺点。
string prettyNameCopy = prettyName;
var matchingProperties = getLocalProperties()
.Where(prop => prop.Name == prettyNameCopy);
或者,您可以使用局部变量(以评估适当的名称等),并在从方法返回之前分配out
参数prettyName
。 如果方法中没有明显的分支,这可能会更具可读性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.