2013-10-31 14 views
16

Ich habe kürzlich herausgefunden, dass Sie die [CanBeNull] Annotation in C# verwenden können, um ReSharper (und anderen Addons) mitzuteilen, dass eine Methode null zurückgeben kann. Das ist großartig, weil ReSharper mich daran erinnert, wenn ich diese Situationen nicht behandle.CanBeNull und ReSharper - mit asynchronen Aufgaben verwenden?

Jedoch für async Methoden, die eine Task oder Task<T> zurückgeben, ist das Verhalten unerwartet.

Zum Beispiel betrachten Sie dieses Beispiel:

[CanBeNull] 
public async Task<string> GetSomeName() { 
    var time = DateTime.Now; 
    if(time.Second == 30) { 
     return "Jimmy"; 
    } else { 
     return null; 
    } 
} 

Ich weiß, dass dieses Szenario ein bisschen komisch ist, aber der Einfachheit halber Bär mit mir. Wenn ich (mit ReSharper aktiviert) versuche, die Methode an anderer Stelle aufzurufen, warnt sie fälschlicherweise. Zum Beispiel:

var myValue = await GetSomeName(); 
var subValue = myValue.Trim(); //here, ReSharper should warn me that subValue is null. 

Hier warnt ReSharper mich an der falschen Stelle. Die erste Zeile erzeugt eine Warnung (und behauptet, dass die Aufgabe selbst Null sein kann, was falsch ist). Die zweite Zeile erzeugt keine Warnung, wo die Warnung hätte sein sollen.

Wenn ich vollständig mit ReSharper erfüllen, so würde dieser Code geschrieben werden:

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. 

} 

Ist das ein Bug mit ReSharper, die ich eingebe sollte? Oder verwende ich die Annotation falsch? Ich denke, wir können alle zustimmen, dass die Aufgabe selbst nie null sein kann, also weiß ich nicht, wie das Sinn macht.

+1

ich empfehle Ihnen, senden Sie es als einen Fehler Re # (historisch gesehen, sie waren langsam arbeiten mit 'async', und sie zu aktualisieren Wenn Sie 'async' in einer PCL verwenden, haben Sie immer noch eine Menge Macken. Sie können' CanBeNull' möglicherweise nicht ändern, aber sie sollten zumindest in der Lage sein, ein 'CanBeNullAsync' zu erstellen. –

+0

Nun 'CanBeNull' ist nicht ihre Erfindung. Es ist Teil von C#. –

+0

In diesem Fall sollten Sie das BCL-Team wahrscheinlich um Rat fragen. –

Antwort

23

Ivan Serduk sagte: „Ausgehend von ReSharper 9.2 EAP4 Attribute [ItemCanBeNull] und [ItemNotNull] können an Einheiten des Typs angewendet werden,‚Aufgabe‘und‚faul‘ . es funktioniert perfekt!

PS Bitte vergessen Sie nicht Jetbrains Anmerkungen.

7

Sie haben eine Einschränkung der Nullwertanalyse von ReSharper erreicht. Es versucht, den Rückgabewert (die Aufgabe) als potenzielles Null und nicht als Ergebnis zu behandeln. Allerdings, das ist ein großartiges Feature Anfrage - ich Abstimmung für dieses Problem würde vorschlagen: http://youtrack.jetbrains.com/issue/RSRP-376091

Verwandte Themen