27

我最近发现您可以使用[CanBeNull]C# 中的注释来告诉 ReSharper(和其他插件)方法可以返回 null。这很棒,因为当我不处理这些情况时,它会让 ReSharper 提醒我。

但是,对于async返回 aTask或 a的方法Task<T>,行为是意外的。

例如,考虑这个例子:

[CanBeNull]
public async Task<string> GetSomeName() {
    var time = DateTime.Now;
    if(time.Second == 30) { 
        return "Jimmy"; 
    } else {
        return null;
    }
}

我知道这种情况有点奇怪,但为了简单起见,请耐心等待。如果我(启用了 ReSharper)然后尝试在其他地方调用该方法,它会错误地发出警告。例如:

var myValue = await GetSomeName();
var subValue = myValue.Trim(); //here, ReSharper should warn me that subValue is null.

在这里,ReSharper 在错误的地方警告我。第一行生成一个警告(它声称任务本身实际上可以为空,这是错误的)。第二行不会产生警告,而这正是警告应该出现的地方。

如果我要完全遵守 ReSharper,则必须编写以下代码:

var myTask = GetSomeName();
if(myTask != null) { 
    //this is silly, and is always true, but ReSharper thinks that the Task can be null due to the CanBeNull attribute.

    var myValue = await myTask;
    var subValue = myValue.Trim(); //this could generate an error, but ReSharper doesn't warn me.

}

这是我应该提交的 ReSharper 错误吗?还是我错误地使用了注释?我想我们都同意任务本身永远不可能null,所以我不知道这有什么意义。

4

2 回答 2

41

Ivan Serduk 在这里说

从 ReSharper 9.2 开始,EAP4 属性“ItemCanBeNull”“ItemNotNull”可以应用于“Task<T>”和“Lazy<T>”类型的实体

它完美无缺!

PS 请不要忘记更新 JetBrains Annotations。

于 2015-09-04T09:10:53.303 回答
7

您遇到了 ReSharper 的空值分析的限制。它试图将返回值(任务)视为潜在的空值,而不是结果。但是,这是一个很棒的功能请求 - 我建议为这个问题投票:http: //youtrack.jetbrains.com/issue/RSRP-376091

于 2013-10-31T14:32:46.090 回答