2010-10-28 54 views
10

我有以下簽名的方法:C# - 如何傳遞「出」參數入λ表達

private PropertyInfo getPropertyForDBField(string dbField, out string prettyName) 

在它,我發現基於給定dbField關聯值prettyName。然後我想找到的所有屬性,如果有的話,有名字prettyName,所以我想做到以下幾點:

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

然而,這提供了以下錯誤:

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

通過我試圖在Where lambda參數prettyName中嘗試使用prettyName的方法中的點肯定已初始化。 I return如果prettyName無法初始化爲有效值。是否有一些技巧我可以在這裏讓我在lambda表達式中使用prettyName

編輯:我使用.NET 3.5,如果它很重要。

+1

如何將存放在prettyName中的值存入一個不同的變量,以便您可以執行'prettyName = someval;'然後在您的anon函數中使用'someval'? – 2010-10-28 18:05:40

回答

16

由於編譯器錯誤指示,不允許在lambda表達式中使用out或ref參數。

爲什麼不只是使用副本?它不像lambda想要改變變量,所以我沒有看到一個缺點。

string prettyNameCopy = prettyName; 
var matchingProperties = getLocalProperties() 
         .Where(prop => prop.Name == prettyNameCopy); 

或者,你可以使用本地整個(以評估適當的名稱等),以及剛剛從該方法返回之前分配out參數prettyName。如果方法中沒有顯着的分支,這可能會更具可讀性。

+0

...好吧,現在我只是覺得很傻。我正在查找如何使用'delegate'或其他瘋狂的東西來做到這一點。謝謝! – 2010-10-28 18:06:44

+0

乾杯。 「委託」也沒有什麼幫助,因爲同樣的限制也適用於匿名代表。 – Ani 2010-10-28 18:12:39

14

只是爲了澄清。可以在lambda中使用來自調用方法的ref/out參數。

如果指定了參數的類型,您也可以使用ref或out。這意味着將prettyName作爲參數發送給lambda。

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

Where子句只接受一個參數,它是列表中的屬性元素。這是阻止你爲lambda添加參數的原因。

不想給人留下錯誤的印象,你不能在lambda中使用這些參數。你不能通過捕獲來使用它們。

+0

向上投票。這正是我需要的。 – 2013-12-20 01:20:58

+0

李,由於某種原因,我無法得到這個工作。我使用的代碼是IEnumerable matchingProperties = getLocalProperties()。Where((prop,ref string prettyName)=> prop.Name.Equals(prettyName) ); ...但它給「ref」(「一個名爲'prettyName'的局部變量不能在這個範圍內聲明,因爲它會賦予已經在父級或當前範圍內使用的'prettyName'不同的含義。 – 2014-06-19 18:26:34

+0

或者你是否說你仍然需要將prettyName重新分配給不同的字符串變量,但是你可以通過ref或out將它傳遞給它? – 2014-06-19 18:31:57