簡體   English   中英

是任務和任務 <T> 互換?

[英]Are Task and Task<T> Interchangeable?

我在嘗試調用特定的方法重載時遇到了打字錯誤,現在我很好奇:為什么以下內容不會引發編譯錯誤?

var a = (Task<Task>) (Task) null; // fine.
var b = (Func<Task<Task>>) (Func<Task>) null; // fine.
var c = (Task<Task<Task>>) (Task<Task>) null; // compilation error.

我希望所有這些例子都會失敗。

第三行( c )中的錯誤: Cannot cast expression of type 'System.Threading.Tasks.Task<System.Threading.Tasks.Task>' to type 'Task<Task<Task>>'

Task<T>Task派生。

您的第一行有點像(int) (object) 1 ,這是完全合法的,因為一切(包括int )都源自Object

您的第二行是同一件事,但行動卻相互矛盾。

第三行失敗是因為沒有為協方差設置Task<T>T參數(實際上,這不可能是因為Task<T>是一個類,而不是接口或委托)。 它適用於Func<TResult>因為Func<TResult> 設置為協方差(即,它的聲明Func<out TResult> 任務可能被設計為故意禁止這樣做,或者他們忘記這樣做。

這是邁克爾的答案的推論:

對於aTask<T>從派生Task ,所以這是確定。

對於bFunc是具有協方差的委托,因此代表我們隱式將Task轉換為Task<T> Func保持不變,因此可以。

對於cTask不能使用協變類型參數,因為它是一個類,並且Task<Task<T>>不能從Task<T>派生,因此這不是正常的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM