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.
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. –
Nun 'CanBeNull' ist nicht ihre Erfindung. Es ist Teil von C#. –
In diesem Fall sollten Sie das BCL-Team wahrscheinlich um Rat fragen. –