我最近发现你可以使用[CanBeNull]C#中的注释告诉ReSharper(和其他插件)一个方法可以返回null.这很棒,因为当我不处理这些情况时,它会让ReSharper提醒我.
但是,对于async返回a Task或a的方法,Task<T>行为是意外的.
例如,考虑这个例子:
[CanBeNull]
public async Task<string> GetSomeName() {
var time = DateTime.Now;
if(time.Second == 30) {
return "Jimmy";
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这种情况有点奇怪,但为了简单起见,请耐心等待.如果我(启用ReSharper)然后尝试在别处调用该方法,它会发出错误警告.例如:
var myValue = await GetSomeName();
var subValue = myValue.Trim(); //here, ReSharper should warn me that subValue is null.
Run Code Online (Sandbox Code Playgroud)
在这里,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.
}
Run Code Online (Sandbox Code Playgroud)
这是我应该提交的ReSharper的错误吗?或者我错误地使用了注释?我想我们都可以同意任务本身不可能null,所以我不知道这有多大意义.
小智 34
Ivan Serduk说:"从ReSharper 9.2 EAP4属性开始[ItemCanBeNull],[ItemNotNull]可以应用于"任务"和"懒惰"类型的实体.它的工作完美!
PS请不要忘记更新Jetbrains Annotations.
您已经达到了ReSharper空值分析的限制.它试图将返回值(任务)视为潜在的null,而不是结果.但是,这是一个很棒的功能请求 - 我建议投票支持这个问题:http://youtrack.jetbrains.com/issue/RSRP-376091