【发布时间】:2013-11-11 08:27:09
【问题描述】:
我最近发现您可以在 C# 中使用 [CanBeNull] 注释来告诉 ReSharper(和其他插件)方法可以返回 null。这很棒,因为当我不处理这些情况时,它会让 ReSharper 提醒我。
但是,对于返回 Task 或 Task<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,所以我不知道这有什么意义。
【问题讨论】:
-
我建议您将其作为错误提交给 Re#(从历史上看,他们使用
async很慢,如果您在 PCL 中使用async,他们仍然有很多怪癖) .他们可能无法更改CanBeNull,但他们至少应该能够创建CanBeNullAsync。 -
好吧
CanBeNull不是他们的发明。它是 C# 的一部分。 -
在这种情况下,您可能应该向 BCL 团队寻求指导。
-
CanBeNull是 ReSharper 的注释属性之一。我不相信它存在于 BCL 中