[英]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>>'
這是邁克爾的答案的推論:
對於a
: Task<T>
從派生Task
,所以這是確定。
對於b
: Func
是具有協方差的委托,因此代表我們隱式將Task
轉換為Task<T>
。 Func
保持不變,因此可以。
對於c
: Task
不能使用協變類型參數,因為它是一個類,並且Task<Task<T>>
不能從Task<T>
派生,因此這不是正常的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.