繁体   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