我有一个带有以下签名的方法:
private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)
在其中,我根据给定的prettyName
找到关联值dbField
。然后,我想查找名称为prettyName
的所有属性(如果有),所以我正在尝试执行以下操作:
IEnumerable<PropertyInfo> matchingProperties =
getLocalProperties().Where(prop =>
prop.Name.Equals(prettyName)
);
但是,这会出现以下错误:
不能在匿名方法,lambda表达式或查询表达式中使用ref或out参数'prettyName'
在我尝试在prettyName
lambda参数中使用Where
的方法中,prettyName
肯定已初始化。如果return
无法初始化为有效值,我prettyName
。我可以在这里做一些技巧让我在lambda表达式中使用prettyName
吗?
编辑:如果重要的话,我正在使用.NET 3.5。
答案 0 :(得分:17)
正如编译器错误所示,不允许在lambda表达式中使用out或ref参数。
为什么不使用副本?这并不像lambda想要改变变量,所以我没有看到一个缺点。
string prettyNameCopy = prettyName;
var matchingProperties = getLocalProperties()
.Where(prop => prop.Name == prettyNameCopy);
或者,您可以使用整个本地(以评估相应的名称等),并在从方法返回之前分配out
参数prettyName
。如果方法中没有明显的分支,这可能会更具可读性。
答案 1 :(得分:17)
只是澄清一下。可以在lambda中使用来自被调用方法的ref / out参数。
如果指定参数类型,也可以使用ref或out。这意味着将prettyName作为参数发送到lambda。
(prop, ref string prettyName) => prop.Name.Equals(prettyName);
Where子句只接受一个参数,即列表中的属性元素。这就是阻止你向lambda添加参数的原因。
不想让人们误以为你不能在lambda中使用这些参数。你不能通过捕获来使用它们。