Warum && und || Kann nicht für NULL-fähigen Typ verwendet werden? [Duplikat]

8

Ich würde ähnliches Verhalten wie + oder * erwarten. Wenn also einer der Operanden null ist, sollte er null ergeben, aber die Kompilierung beschwert sich, wenn sie in & amp; & amp; oder ||. Warum?

Um den Punkt zu verdeutlichen:

%Vor%     
newman 22.05.2011, 22:51
quelle

4 Antworten

10

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.

    
pickypg 22.05.2011, 23:01
quelle
2

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.

    
Weeble 22.05.2011 23:07
quelle
0

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).

    
Danny Varod 22.05.2011 23:04
quelle
-3

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: Ссылка

    
jscharf 22.05.2011 23:00
quelle

Tags und Links