2014-02-05 64 views
2

下面的代码提供错误CS0121,超载分辨率和异步等待

的调用以下方法或属性之间暧昧:“RunTask(System.Func<System.Threading.Tasks.Task>)”和“RunTask(System.Action)

static void RunTask(Func<Task> intTask) 
{ 
} 

static void RunTask(Action voidTask) 
{ 
} 

static async Task DoAsyncTask() 
{ 
    await Task.Delay(500); 
} 

public static void Main(string[] args) 
{ 
    var asyncTask = new Func<Task>(DoAsyncTask); 
    RunTask(DoAsyncTask); 
} 

但下面的代码可编译

static void RunTask(Func<Task> intTask) 
{ 
} 

static void RunTask(Action voidTask) 
{ 
} 

static async Task DoAsyncTask() 
{ 
    await Task.Delay(500); 
} 

public static void Main(string[] args) 
{ 
    var asyncTask = new Func<Task>(DoAsyncTask); 
    RunTask(asyncTask); 
} 

为什么这么说?

回答

3

尝试确定采用委托的最佳重载方法时,C#编译器不会考虑委托的返回类型。

另见this question

+0

很公平,但为什么一个委托可以编译? – imgen

+0

因为您已明确声明asyncTask的类型为Func ,因此编译器很容易。 – Moeri