为何期望返回Task时可返回Task<TResult>?
问题解答
这不是语法糖的作用,本质是C#的派生类到基类的隐式转换特性
Task<int>是Task的直接派生类,就像Dog继承自Animal一样,你可以把Dog实例赋值给Animal类型的变量/返回值。这里GetRandomNumberAsync()返回的Task<int>对象,完全符合GetRandomNumber()方法返回Task的要求,所以编译运行都没问题。和
async/await语法糖无关
哪怕把异步方法换成普通的返回Task<int>的方法,代码依然能正常工作。比如:private static Task<int> GetRandomNumberSync() { return Task.FromResult(new Random().Next()); } public static Task GetRandomNumber() { return GetRandomNumberSync(); }这段代码的运行逻辑和原代码一致,核心原因还是派生类到基类的隐式转换。
关于“只要期望基类就总能返回派生类”的问题
大部分场景下成立,但需要满足两个前提:- 派生类确实继承(或实现)了目标基类(或接口)
- 不存在特殊的类型转换限制(比如值类型只能隐式转换到
object或ValueType,而引用类型的向上转型基本都支持)
只要符合这两个条件,返回派生类给期望基类的方法/变量是完全合法的。
内容的提问来源于stack exchange,提问作者so_as
相关产品推荐
相关产品推荐

