gpt4 book ai didi

c# - Task.FromResult 的可空性警告

转载 作者:行者123 更新时间:2023-12-05 05:03:48 29 4
gpt4 key购买 nike

我们的代码库(.NET Standard 2.0 库)中有以下方法:

public Task<T> GetDefaultTask<T>()
{
return Task.FromResult(default(T));
}

我们目前正在尝试转向 C# 8.0 可空性并在上面的代码中收到警告:

warning CS8604: Possible null reference argument for parameter 'result' in 'Task Task.FromResult(T result)'.

为什么我们会收到此警告?对我来说,它看起来非常好,可以通过 null作为 Task.FromResult 的参数.

重要说明:我们希望允许任务包含空值。但是添加 Task<T?>会迫使我们添加我们无法做到的类型约束。

最佳答案

如果T是不可为 null 的引用类型,null不应传递给 Task.FromResult<T> . Task.FromResult的执行不关心空引用,你可以使用 Task.FromResult(default(T)!) ,然后是 GetDefaultTask 的调用者可能会收到 Task<string>当它实际上应该是 Task<string?> .类似 GetDefaultTask<string>().Result.Length 的代码会在没有警告的情况下编译并在运行时导致空引用异常。

据我所知,目前无法在这种情况下正确注释返回类型。

将方法声明为 Task<T?> GetDefaultTask<T>()不允许,因为 T可以是结构或引用类型,可空结构和引用类型的表示方式不同。

如果 T 就可以彻底解决这个问题被限制为引用类型:

public Task<T?> GetDefaultTask<T>() where T : class

但是添加该约束可能会导致调用链的更上游出现问题,具体取决于 T 所在的位置参数来自。

对于通用返回值可以是结构或引用(例如 Enumerable.FirstOrDefault )的类似情况,有 [MaybeNull]属性,但这只能应用于返回值本身(在本例中为任务),而不能应用于任务的通用参数。

关于c# - Task.FromResult 的可空性警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61448239/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com