我在尝试调用特定的方法重载时遇到了打字错误,现在我很好奇:为什么以下内容不会引发编译错误?

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

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

第三行失败是因为没有为协方差设置TTask<T>参数(实际上,不可能是因为Task<T>是一个类,而不是接口或委托)。它适用于Func<TResult>,因为Func<TResult>为协方差设置(即,它声明为Func<out TResult>)。任务可能被设计为故意禁止这样做,或者他们忘记这样做。

关于c# - Task和Task <T>是否可以互换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50707049/

10-15 06:15