我在尝试调用特定的方法重载时遇到了打字错误,现在我很好奇:为什么以下内容不会引发编译错误?
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
。
您的第二行是同一件事,但行动却相互矛盾。
第三行失败是因为没有为协方差设置T
的Task<T>
参数(实际上,不可能是因为Task<T>
是一个类,而不是接口或委托)。它适用于Func<TResult>
,因为Func<TResult>
为协方差设置(即,它声明为Func<out TResult>
)。任务可能被设计为故意禁止这样做,或者他们忘记这样做。
关于c# - Task和Task <T>是否可以互换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50707049/