CanBeNull和ReSharper – 将它与异步任务一起使用?

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

但是,对于返回TaskTask async方法,行为是意外的。

例如,考虑这个例子:

 [CanBeNull] public async Task 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在不正确的地方警告我。 第一行生成一个警告(它声称任务本身实际上可以为null,这是错误的)。 第二行不会生成警告,警告应该是警告的位置。

如果我完全遵守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 ,所以我不知道这有多大意义。

Ivan Serduk说:“从ReSharper 9.2开始,EAP4属性[ItemCanBeNull][ItemNotNull]可以应用于”任务“和”懒惰“类型的实体。它完美无缺!

PS请不要忘记更新Jetbrains Annotations。

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