以下调用重载Enumerable.Select
方法:
var itemOnlyOneTuples = "test".Select<char, Tuple<char>>(Tuple.Create);
Run Code Online (Sandbox Code Playgroud)
失败并出现歧义错误(为清晰起见,删除了名称空间):
The call is ambiguous between the following methods or properties:
'Enumerable.Select<char,Tuple<char>>
(IEnumerable<char>,Func<char,Tuple<char>>)'
and
'Enumerable.Select<char,Tuple<char>>
(IEnumerable<char>, Func<char,int,Tuple<char>>)'
Run Code Online (Sandbox Code Playgroud)
我当然可以理解为什么不明确指定类型参数会导致歧义(两个都会应用重载),但是在这样做后我没有看到.
对我来说似乎很清楚,目的是调用第一个重载,方法组参数解析为Tuple.Create<char>(char)
.第二个重载不应该适用,因为没有任何 Tuple.Create
重载可以转换为期望的Func<char,int,Tuple<char>>
类型.我猜测编译器很困惑Tuple.Create<char, int>(char, int)
,但它的返回类型是错误的:它返回一个二元组,因此不能转换为相关Func
类型.
顺便说一句,以下任何一个使编译器开心:
Tuple.Create<char>
也许这实际上是一个类型推断问题?).x => Tuple.Create(x)
.(在Select
通话中使用类型推断很好).不出所料,尝试以Select
这种方式调用其他重载也会失败:
var itemIndexTwoTuples = "test".Select<char, Tuple<char, int>>(Tuple.Create);
Run Code Online (Sandbox Code Playgroud)
这里的确切问题是什么?