2017-08-27 80 views
1

我有一個問題,在過去的幾天裏一直在吃我的頭。我無法找到解決方案。Lambda表達式錯誤

我試圖在使用lambda表達式的字符串中找到'\'的出現。代碼如下:

Microsoft.Office.Interop.Excel.Range labelSupportTopic = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[resultRange.Row, 29]; 
int count = labelSupportTopic.Text.ToString().Count(c => c == '\\'); 

我從Excel工作表中獲取日期,因此是Interop參考。

什麼困擾我的是,這個代碼是複製並從一個完全一樣的粘貼 VS項目,其大部分的代碼我失去了莫名其妙。我很幸運有一部分,這是其中之一。無論如何,在我的另一個VS項目(我失去了代碼的項目)上,我能夠構建並且看起來很好。但是我目前的項目,我從頭開始構建的,它在Build上引發了一個錯誤。這整個部分,包含這個邏輯的部分從我的舊項目(Builds罰款)中解除。錯誤信息爲「不能首先將lambda表達式作爲參數用於動態分派的操作,而無需先將其轉換爲委託或表達式樹型」我搜索了互聯網,但無法找到解決方案。

你能幫忙嗎?!

+0

如果你在調試模式下運行你的代碼,你能看到'Microsoft.Office.Interop.Excel.Range'是否是'dynamic'?如果是這樣,那就是你的問題。你不能使用動態的lambda表達式或擴展方法。 – Connor

+0

'... ToString()。Count((Predicate )(c => c =='\\'));' –

+0

@Connor感謝您的回覆。標記的答案解決了它! –

回答

1
int count = (labelSupportTopic.Text as string).Count('\\'.Equals); 

由於.Text類型是dynamic,的.ToString()種類也dynamic,和c在lambda表達式的類型不能被推斷。

在早期版本的C#中,沒有dynamic關鍵字(在VS 2010之前),.Text的類型爲object,並且您的原始版本應該無問題地編譯。

+0

我不會使用'as',因爲它意味着你期望它可能不是一個字符串,如果text屬性不是字符串,它只會導致null引用異常。如果您希望它始終是一個字符串,並且它不是一個字符串,則可以使用常規轉換,否則,在不是字符串的情況下,使用空合併運算符將其默認爲「」。否則,我認爲這個答案是正確的。 –

+0

@Sahuagin你是對的,但我覺得這個表單比'((string)(labelSupportTopic.Text))'更具可讀性''。對於具有不同文本值的'Range','.Text'可以返回null,但對於單個單元格,它至少會返回''「',所以我刪除了'?? 「」從我最初的樣本中。 – Slai

+0

這似乎解決了這個問題。儘管從另一個項目中複製並粘貼了精確的代碼,但我不明白這一點,但它不起作用。任何想法它會做什麼?老實說,我沒有改變一件事。 –