[英]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.