CanBeNull和ReSharper-将其用于异步任务? [英] CanBeNull and ReSharper - using it with async Tasks?

查看:22
本文介绍了CanBeNull和ReSharper-将其用于异步任务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

但是,对于返回TaskTask<T>async方法,这种行为是意外的。

例如,考虑以下示例:

[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,所以我不知道这有什么意义。

推荐答案

Ivan Serduk said here

从ReSharper 9.2开始,EAP4属性"ItemCanBeNull""ItemNotNull"可以应用于&Quot;任务<;T&>和&Quot;Lazy<;T&>类型的实体

完美无瑕!

附注。请不要忘记更新JetBrains批注。

这篇关于CanBeNull和ReSharper-将其用于异步任务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆