我喜欢Linq语法及其强大功能,但有时候我无法理解为什么事情会起作用。
就像现在一样。我有以下代码:
Regex regex = new Regex( ... );
int result1 = stringList.Count(regex.IsMatch);
IEnumerable<string> result2 = stringList.Where (x => regex.IsMatch (x));
正如您在第一个查询中看到的,我可以使用较短的方法组'regex.IsMatch',但在第二个查询中我必须写'x =&gt; regex.IsMatch(x)'。
作为Count和Where两者采用类型
的相同参数Func<string, bool>
我无法理解为什么在执行此操作时出现编译器错误:
IEnumerable<string> result2 = stringList.Where (regex.IsMatch);
答案 0 :(得分:5)
基本上,这是一个重载解决问题。
Count
只有一个带有两个参数的重载(扩展参数+谓词),但是Where
有两个(谓词考虑项目索引的一个,而不考虑项目索引的一个)。更复杂的是,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。