2013-10-31 8 views
16

私は最近、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になることはできないと私たちは皆同意できると思うので、これはどういう意味があるのか​​分かりません。

+1

私はあなたが再#(歴史的に、彼らはasync' 'で動作するように遅かった、と彼らにバグとしてそれを提出することをお勧めします'CanBeNull'を変更することはできませんが、少なくとも' CanBeNullAsync'を作成できるはずです。 –

+0

よく'CanBeNull'は発明されていません。これはC#の一部です。 –

+0

その場合は、おそらくBCLチームにガイダンスを依頼する必要があります。 –

答えて

23

イワンSerdukは言った:タスク 『と『レイジー』「[ItemCanBeNull][ItemNotNull]属性EAP4 ReSharperの9.2から出発したタイプのエンティティに適用することができます』 。これは完璧な作品!

PSはJetBrainsの注釈を更新することを忘れないでください。

7

あなたはReSharperのヌル値分析の限界にぶつかってきました。結果ではなく、戻り値(タスク)を潜在的なnullとして処理しようとしています。しかし、それは素晴らしい機能要求だ - 私は、この問題のために投票をお勧めしたい:http://youtrack.jetbrains.com/issue/RSRP-376091

関連する問題