Da Tests dieser Art zu unerwarteten Fehlern in Programmen führen können, haben sie es vorgezogen, explizite Boolesche Ausdrücke zu verwenden (wie Java), anstatt eine implizite Konvertierung in Dies ist auch der Grund, warum Sie ein Kurz gesagt, wurde es nicht einbezogen, um Lesbarkeit und Explizitheit zu begünstigen. Ja, es kommt zu einem leichten Preis in der Kürze, aber die Gewinne in der Verringerung von unerwarteten Fehlern mehr als die Kosten von hainvg, um (Sie können natürlich eine implizite Konvertierung eines benutzerdefinierten Typs in bool
. int
nicht als booleschen Ausdruck in C # verwenden können. Da die einzigen gültigen booleschen Ausdrücke Ausdrücke sind, die direkt in bool
ausgewertet werden, werden unerwartete Fehler im Code verhindert, z. B. der alte C-Fehler: != null
innerhalb der hinzuzufügen Klammer ... bool
als Workaround erstellen, aber Sie können dies global nicht auf einen beliebigen Objekttyp anwenden)
Warum gibt es in C # keine Entsprechung, die es uns erlauben würde, Folgendes zu tun?
Um verwendet zu werden, muss eine Funktion zuerst lauten:
An die Funktion, die Sie erwähnen, wurde gedacht. Es wurde nicht vom Design-Komitee entworfen, spezifiziert oder genehmigt, es wurde nicht vom Entwicklungsteam implementiert, es wurde nicht getestet und es wurde noch nie in einem Produkt geliefert. Daher können Sie die Funktion nicht verwenden.
Wenn das Ihre Frage nicht beantwortet, dann eine bessere Frage stellen . Zu fragen, warum eine Sprache keine Funktion hat, ist wie die Frage, warum eine Box leer ist. Jede leere Box ist aus dem gleichen Grund leer: weil nichts darin ist . Jede nicht verfügbare Funktion ist nicht verfügbar, da sie nie an Kunden ausgeliefert wurde, und es gibt nicht viel mehr darüber zu sagen.
Technisch gesehen funktioniert es nicht, weil es keine implizite Konvertierung gibt, die von Ihrer Benutzerdefiniert ist Objektklasse zu bool
(boolean). Solange Sie einen impliziten Konvertierungsoperator angeben, der Ihr Objekt auf Null prüft, können Sie mit Ihrer Syntax fortfahren:
Integration des Vorschlags durch Dan Bryant :
Alternativ können Sie implizite "true" - und "false" -Operatoren für Ihren Datentyp implementieren. Dies ist möglicherweise erforderlich, wenn Ihr Typ die Tristate-Auswertung für bool
zulässt: true, false und null. Dies ist ein häufiger Fall in Datenbanken, in denen der Nullwert fehlende Daten angibt. Hier ist ein Beispiel aus der MSDN-Webseite :
Weil es nicht in der C # Spezifikation ist und der Compiler einen solchen Ausdruck nicht versteht.
Und wenn Sie nach dem Grund suchen, warum es in C # nicht auf diese Weise verwendet wird - ist es aus meiner Sicht völlig unlogisch, etwas auf eine Art und Weise zu überprüfen, wenn (Objekt).
Wenn Objekt was?
Ihr Beispiel sieht nur lesbar aus, weil Ihr Objekt "Objekt" genannt wird. In Wirklichkeit haben Objekte Namen, die von ihrer Verwendung / Funktion herrühren. Wenn Ihr Objekt "validedWidget" heißt, würde Ihr Code wie folgt aussehen:
%Vor%Was würde fälschlicherweise etwas bedeuten wo:
%Vor%Ist viel expliziter und macht kaum Arbeit.
Syntax von if-Anweisung ist ::
%Vor%und das Ergebnis der Bedingung sollte boolesch sein, d.h. wahr oder falsch.
Also schreiben wir jede Bedingung wie
%Vor%aber wenn (Objekt) nicht eine bestimmte Bedingung ergibt, um als Boolesches Ergebnis herauszukommen.
wenn wir
schreiben %Vor%dann wird es vollkommen in Ordnung sein.
Aber um zu sehen, ob irgendein Objekt Null ist oder nicht, können wir nicht schreiben, wenn (Objekt) wir es schreiben müssen als ob (Objekt == null) oder wenn (Objekt! = null), weil solche Bedingungen resultieren boolesches Ergebnis.