以下调用重载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)
这里的确切问题是什么?
我刚刚遇到以下代码(.NET 3.5),它看起来不应该编译给我,但确实如此,并且工作正常:
bool b = selectedTables.Any(table1.IsChildOf));
Run Code Online (Sandbox Code Playgroud)
Table.IsChildOf实际上是一个具有以下签名的方法:
public bool IsChildOf(Table otherTable)
Run Code Online (Sandbox Code Playgroud)
我认为这相当于:
bool b = selectedTables.Any(a => table1.IsChildOf(a));
Run Code Online (Sandbox Code Playgroud)
如果是这样,那么适当的术语是什么?