异步方法的返回值用“NotNullIfNotNull”修饰,仍返回可能为 null 的变量

Async method's return decorated with "NotNullIfNotNull" still returns variable that may be null

提问人:Luke Vo 提问时间:8/8/2023 更新时间:8/8/2023 访问量:76

问:

根据此文档,我可以用属性装饰方法。但是,以下代码不起作用:NotNullIfNotNull

using System.Diagnostics.CodeAnalysis;

var a = await Test("abc");
Console.WriteLine(a.Length);

[return: NotNullIfNotNull(nameof(input))]
static async Task<string?> Test(string? input)
{
    return await Task.FromResult(input);
}

我仍然收到警告(取消引用可能为空的引用):a.Length

enter image description here

我怀疑 Task 导致了这个问题。我可以确认问题只发生在(返回)方法上。我应该如何解决这个问题?asyncTask

C# .NET 代码分析 可以为 null 的引用类型

评论

4赞 madreflection 8/8/2023
它是标记,而不是.Task<T>T
0赞 Luke Vo 8/8/2023
@madreflection是的,我注意到了这一点。我应该如何装饰它?
0赞 madreflection 8/8/2023
该属性不提供修饰类型参数的方法。功能请求。
1赞 madreflection 8/8/2023
...不为 null,它需要单独表示它们。这很复杂。我相信编译器团队愿意这样做,但他们必须检查用例,并确保他们不会将自己设计成墙。渐进式步骤有助于避免这种情况。
1赞 Luke Vo 8/8/2023
@madreflection你是对的。我找到了关于它的讨论。已经 4 年了,似乎很快就没有解决方案

答: 暂无答案