2011-12-01 77 views
4

我喜欢Linq语法及其功能,但有时我不明白为什么事情在工作时会起作用。用方法组替换Lambda表达式时发生编译器错误

就像现在一样。我有以下的代码:

Regex regex = new Regex(...); 

int result1 = stringList.Count(regex.IsMatch); 
IEnumerable<string> result2 = stringList.Where (x => regex.IsMatch (x)); 

正如你可以在第一个查询看我可以使用较短的方法组“regex.IsMatch”,但在第二个查询我必须写的“x =>正则表达式.IsMatch(x)'。

作为计数和地点都采取型相同的参数

Func<string, bool> 

我不明白为什么我得到一个编译错误,当我这样做:

IEnumerable<string> result2 = stringList.Where (regex.IsMatch); 

回答

5

从本质上讲,这是一个重载解决问题。

Count只有一个接受两个参数(扩展参数+谓词)的重载,但Where有两个(谓词认为是item-index,另一个没有)。使事情复杂化,Regex.IsMatch有它自己的多个重载。 现在事实证明,编译器是正确的,因为的IsMatch是真正适用(每一个都是用不同的超载Where兼容)这些重载的抱怨歧义:

// Where overload without item-index 
Regex.IsMatch(string) is compatible with Where<string>(string, Func<string, bool>) 

// Where overload with item-index 
Regex.IsMatch(string, int) is compatible with Where<string>(string, Func<string, int, bool>) 

...但可能存在其他涉及方法组的相关案例(需要返回类型分析时)compiler can complain about ambiguity even when there is no ambiguity for a human

+0

谢谢,现在完全合理:) –