如何将Task<string>实例作为Task<string?>参数传递给方法
报错根因
C# 可空引用类型体系下,泛型类Task<T>是不变的:虽然string可以安全隐式转换为string?,但Task<string>和Task<string?>是完全独立的两个类型,不存在默认的隐式转换规则,因此编译器会抛出CS8620警告。
处理方案
直接修改Foo返回结果的调用写法(无需调整原有方法定义)
两种常用的安全写法:
- 用
AsTask方法显式指定可空泛型类型,无额外性能开销,无安全风险:await Foo().AsTask<string?>().Bar(); - 直接做显式强制类型转换,写法更简洁:
await ((Task<string?>)Foo()).Bar();
可选优化方案(无需修改调用写法)
如果不想每次调用都写转换逻辑,可以调整扩展方法的定义,让它天然兼容可空和非空的string类型Task参数:
// 调整为泛型方法,加对应约束即可 public async static Task Bar<T>(this Task<T> task1) where T : string? { // 原有方法逻辑不需要修改 }
调整后原有调用await Foo().Bar();可直接正常运行,不会触发任何警告。
内容的提问来源于stack exchange,提问作者Patrick Szalapski
相关产品推荐
相关产品推荐

