【发布时间】:2018-03-30 18:38:36
【问题描述】:
考虑以下程序:
using System;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
var stringTask = Task.FromResult("sample");
stringTask.TeeAsync(st => Task.CompletedTask).Wait();
}
}
public static class FunctionalExtensions
{
public static async Task<T> TeeAsync<T>(this T source, Func<T, Task> asyncAction)
{
await Task.Delay(0); // todo: do something with source
return source;
}
public static async Task<T> TeeAsync<T>(this Task<T> asyncSource, Func<T, Task> asyncAction)
{
var source = await asyncSource;
await Task.Delay(0); // todo: do something with source
return source;
}
}
第 9 行出现编译器错误,其中在 stringTask 上调用了 TeeAsync,因为
以下方法或属性之间的调用不明确:'FunctionalExtensions.TeeAsync
(T, Func )' 和 'FunctionalExtensions.TeeAsync (Task , Func )'
从每个重载中删除第二个参数突然允许编译器区分Task<T> 和T 第一个参数。但是为什么第二个参数——两个重载之间相同——导致编译器感到困惑呢?
【问题讨论】:
-
@maccettura 将编译器错误消息从代码示例更改为块引用导致错误消息的某些细节被隐藏,例如错误消息中引用的方法和类的泛型类型参数。
-
我没有看到任何变化,除了格式。查看编辑历史,我删除了 4 个空格字符并添加了
>。任何不在你问题中的东西都是因为它从来没有。 -
我知道你编辑了什么。我以前看过。现在请查看您在编辑视图中看到的实际文本,并与您在此渲染页面上看到的内容进行比较。缺少类型。相信我。
-
啊,我错过了。我以为您在谈论不存在的额外信息(例如错误消息本身的更多信息)。现在好看吗?您的代码块以前很难阅读,因为它只有一个长的可滚动字段,现在我们可以在视口中看到所有内容。
-
你现在看起来。烦人的块引用需要特殊的编码。
标签: c# .net generics overload-resolution