私は最近、C# の注釈を使用して、[CanBeNull]
ReSharper (およびその他のアドオン) にメソッドが null を返すことができることを伝えることができることを知りました。これは素晴らしいことです。ReSharper は、私がそのような状況を処理していないときに思い出させてくれるからです。
ただし、 aまたはasync
を返すメソッドの場合、動作は予想外です。Task
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 は間違った場所で私に警告します。最初の行は警告を生成します (そして、タスク自体が実際には null になる可能性があると主張していますが、これは間違っています)。2 行目は、警告が発生するはずだった場所である警告を生成しません。
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
.