2014-02-05 87 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