私は最近、C#で[CanBeNull]
注釈を使用して、ReSharper(および他のアドオン)にメソッドがnullを返すことができることを伝えました。 ReSharperは、私がそれらの状況を処理しないときに私に思い出させるので、これは素晴らしいことです。CanBeNullとReSharper - 非同期タスクで使用していますか?
ただし、Task
またはTask<T>
を返すasync
メソッドの場合、予期しない動作です。例えば
、この例を考えてみます。
[CanBeNull]
public async Task<string> GetSomeName() {
var time = DateTime.Now;
if(time.Second == 30) {
return "Jimmy";
} else {
return null;
}
}
私は、このシナリオは少し奇妙であることを知っているが、簡単のために、私と一緒にクマ。 I(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
になることはできないと私たちは皆同意できると思うので、これはどういう意味があるのか分かりません。
私はあなたが再#(歴史的に、彼らはasync' 'で動作するように遅かった、と彼らにバグとしてそれを提出することをお勧めします'CanBeNull'を変更することはできませんが、少なくとも' CanBeNullAsync'を作成できるはずです。 –
よく'CanBeNull'は発明されていません。これはC#の一部です。 –
その場合は、おそらくBCLチームにガイダンスを依頼する必要があります。 –