2016-11-11 4 views
5

Ich habe die folgende Codezeile:Warum kann der Null-Bedingungsoperator verwendet werden, wenn der Wert eines Bool gesetzt wird, ohne ein NULL-Bool zu verwenden?

user.Exists = await this.repository?.Exists(id); 

Exists auf der linken Seite ist eine Eigenschaft der User Klasse. Sein Typ ist nur bool, nicht bool?. Die Methode Exists auf der rechten Seite ist eine API-Methode, um zu überprüfen, ob eine bestimmte Entität im Repository vorhanden ist. Es gibt Task<bool> zurück. Ich möchte prüfen, ob das Repository zuerst null ist, also verwende ich den bedingten Nullenoperator. Ich dachte, wenn das Repository null ist, würde die ganze rechte Seite einfach null zurückgeben, was nicht einem bool Typ zugewiesen werden kann, aber der Compiler scheint damit in Ordnung zu sein. Fällt es einfach auf einen falschen Wert?

+0

Versucht, diesen Code tatsächlich auszuführen? Wenn nicht, versuchen Sie es und Sie werden sehen. Oder stellen Sie sich vor, was passieren würde, wenn die Exists-Methode null statt Task – Evk

+0

zurückgibt. Nun, 'await' könnte die Typüberprüfung wegwerfen, aber was würden Sie erwarten, wenn' repository' null ist? –

Antwort

7

Das Problem ist das Warten. Die Nullable ist vor dem Warten, also ist es wie await (this.repository?.Exists(id)), die, wenn this.repository null ist, await (null?.Exists(id)) wird, was in await (null) verwandelt wird, was abstürzt. Das ?. ist nicht in der Lage zu erreichen in Task<bool> und macht es Task<bool?>.

So erhalten Sie entweder die richtige Boolesche oder eine Ausnahme.

+0

Ah, das macht Sinn, danke für die Erklärung. Dann ändere ich es besser. – Drew

+0

@ChadNedzlek - Per Antwort auf meine Frage, ich denke, es ist eine gute Antwort und gab mir die Informationen, die ich suchte. Ich denke, wenn Sie einen bestimmten Abschnitt dieses Artikels veröffentlichen, wird die Antwort gut sein und ich werde upvote & accept. Ich schätze deine Antwort :) –

Verwandte Themen