[英]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.