为什么当需要 Task 时可以返回 Task<TResult>?

Why can you return Task<TResult> when Task is expected?

提问人:so_as 提问时间:1/9/2023 最后编辑:so_as 更新时间:1/13/2023 访问量:115

问:

当我搞砸任务时,我制作了一个私有的静态异步方法,该方法在延迟后返回一个随机数。我还制作了一个调用私有静态异步方法的公共静态方法,但我忘记将返回类型从 更改为 。TaskTask<int>

public static Task GetRandomNumber()
{
  return GetRandomNumberAsync();
}

private static async Task<int> GetRandomNumberAsync()
{
  await Task.Delay(2000);
  var rnd = new Random();
  return rnd.Next();
}

这只是一些速记版本在起作用吗?如果不是,这是否意味着如果基类是预期的,则始终可以返回派生类?

C# OOP 继承派 基类

评论

5赞 jazb 1/9/2023
因为对象是 Task 的子类。Task<TResult>
2赞 Jon Skeet 1/9/2023
“如果不是,这是否意味着如果基类是预期的,你总是可以返回一个派生类?”是的。这只是正常的继承,就像自 C# 1.0 以来的工作方式一样。
0赞 Fildor 1/9/2023
另请参阅:“LSP”

答:

0赞 JonasH 1/9/2023 #1

这是否意味着如果基类是预期的,您始终可以返回派生类?

是的。所有 s 都是 s,因此将引用从前者转换为后者总是可以的。对于返回值以及参数和其他情况下都是如此。Task<T>Task

这只是正常的继承,如果您不熟悉,我建议您阅读介绍,因为这是一个相当基本的话题。

评论

0赞 M.M 1/13/2023
它是一种始终作为基类的语言特性,还是这只是定义的一部分?X<T>XTask
0赞 JonasH 1/13/2023
@M.M 这只是 .看一下 List<T>,虽然它继承自 和 ,但它不继承自TaskIListIList<T>List