Wenn Sie null
zurückgeben würden, dann würden Sie die boolesche Anforderung ungültig machen.
Im Grunde würde es einen anderen Wert als bool
(speziell null
) innerhalb einer if
Anweisung zulassen, was ein undefiniertes Verhalten wäre, da if
Anweisungen bool
ean Ausdrücke erfordern.
Interessanterweise ist dies einer der Bereiche, in denen sich Java und C # unterscheiden. Java benötigt boolesche Werte auch in der if
-Anweisung, aber ihre Version von bool?
( Nullable<bool>
oder nur Boolean
in Java) kann null
sein. Dies führt zu etwas unerwarteten NullPointerException
s zur Laufzeit, was C # mit dieser Anforderung vermeidet.
Wahrscheinlich weil & amp; & amp; und || sind Kurzschließer. Sie können & amp; und | mit bool? und ich glaube, Sie erhalten dreiwertige Logik - null wird als "unbekannt" behandelt. So falsch & amp; null ist falsch, aber wahr & amp; null ist null. Das ist verwirrend genug, um den Überblick zu behalten, ohne auch nur kurzzuschließen! Es ist möglich, dass Kurzschlüsse angesichts von Nullwerten eigentlich nichts nützen.
EDIT - Unter Berücksichtigung ist ein Kurzschluss für eine dreiwertige Logik noch sinnvoll. Ein logisches AND mit false auf der linken Seite wird immer als falsch gewertet, auch wenn es auf der rechten Seite null ist. Ein logisches OR mit einem Wert für "true" auf der linken Seite wird immer als "true" gewertet, auch wenn es auf der rechten Seite null ist. Ich stelle mir vor, dass dies einer der "nicht die Mühe wert ist, um zu implementieren" Features. Manchmal benötigen Sie eine kurzgeschlossene Boolesche Logik. Manchmal benötigen Sie dreiwertige Boolesche Logik. Aber sehr selten überschneiden sich die beiden.
Selbst wenn (x & amp; & amp; y) möglich wäre, wäre das Ergebnis bool? und nicht Bool. If () funktioniert nur mit bool.
Probiere if (((bool) (x ?? false)) & amp; & amp; (bool) (y ?? false)) statt.
Oder noch besser, nach der Antwort von Weebles:
If (x & amp; y == wahr).
Nullable-Typen sind tatsächlich Objekte. Wenn Sie den Nullwertoperator '?' Bei einem Werttyp (z. B. bool) wird es zu einem Verweis auf ein Objekt, das entweder "null" oder den Wert des zugrunde liegenden Werttyps enthält.
Bedenken Sie Folgendes:
%Vor%Das wird tatsächlich:
%Vor%Der Werttyp wird tatsächlich zu einer Objektinstanz und nimmt daher nicht an Booleschen Ausdrücken teil, wie es reguläre Werttypen tun.
Weitere Informationen: Ссылка