2017-08-27 87 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

这似乎解决了这个问题。尽管从另一个项目中复制并粘贴了精确的代码,但我不明白这一点,但它不起作用。任何想法它会做什么?老实说,我没有改变一件事。 –