2013-07-29 17 views
5

Ich habe folgendes, wenn die Bedingung param.days eine Zeichenfolge ist.Warum ist das in C# nicht erlaubt?

if (param.days != null) 

Dies funktioniert gut, aber wenn ich

If (param.days) 

sagen dann ist es nicht richtig zur Laufzeit bewerten. Beide Anweisungen sind in C# nicht identisch.
Es wird gesagt, dass der Wert null ist, aber dann C# versucht, es auf eine Bool zu werfen, die nicht Nullable ist. Warum haben sich die C# -Designer dafür entschieden? Eine solche Anweisung ist in C++ gültig, aber warum wird dies in C# nicht als gültig angesehen?

+11

null ist kein boolean – Sayse

+4

Was ist die Art von 'param.days'? –

+0

@Sayse: Ja, verstehe ich, aber gibt es einen anderen Grund dafür, dass dies nicht richtig ausgewertet wird. Oder liegt es daran, dass Bool kein Nullwert ist und es keinen anderen Ausweg gibt? – ckv

Antwort

18

Eine solche Aussage ist gültig in C++, aber warum wird dies nicht als gültig betrachtet in C#

Da C# unterschiedliche languange Regeln annimmt. Es wird nicht angenommen, dass jede Zahl/Referenz als boolescher Wert behandelt werden kann, indem geprüft wird, ob sie null gegen nicht null, null gegen nicht null ist. Wenn Sie testen möchten, ob etwas null ist: testen, ob es null ist.

Hinweis: Wenn days ist eigentlich ein T? (aka Nullable<T>), dann können Sie überprüfen:

if(param.days.HasValue) 

, die dann auf if(param.days != null) identisch ist

Alternativ, wenn Ihr Typ kann vernünftig behandelt werden Als Boolean gibt es Operatoren, die Sie überschreiben können, um dem Compiler das mitzuteilen.

1

In C# erfordert die Anweisung If, dass der Inhalt der Brackers ein boolescher Ausdruck ist.

Betrachten Sie If ("Hello World").

Ist "Hallo Welt" wahr oder falsch? Es ist auch nicht, es ist eine Zeichenfolge.

Sie möchten vielleicht einen LINQ-Ausdruck wie .Any() zum Beispiel If (myListOfCats.Any()) betrachten, da Ihre .days-Eigenschaft eine Sammlung von Objekten impliziert.

+2

Das ist ein schreckliches Beispiel, da 'if (" Hello World ")' in C++ kompiliert wird. Die Frage fragt nach dem Unterschied zwischen C++ und C#, so dass dies nicht wirklich beantwortet wird. – Dukeling

+3

Es ist nicht 'C++', es ist 'C#' – NibblyPig

+0

@Dukeling Sie könnten argumentieren, die Frage fragt eigentlich, warum C# keine Syntax unterstützt, die in C++ möglich ist, nicht unbedingt die Unterschiede zwischen ihnen. –

1

Der Vergleich in der if-Anweisung muss zu einem booleschen Ergebnis ausgewertet werden. param.days ist kein Boolescher Wert. Sie müssen den Wert mit null vergleichen, um ein boolesches Ergebnis zu erhalten. C# ist typsicher.

6

C# im Gegensatz zu C++ impliziert nicht implizit Integer zu Bool.

1

Der Vergleich in der if Anweisung erfordert ein boolean Ergebnis. param.days ist string kein boolean. C# impliziert nicht unbedingt integer zu bool.

Sie müssen den Wert vergleichen oder string.IsNullOrEmpty() verwenden, um null ein boolean Ergebnis zu bekommen Wenn Sie diesen Code tun wollen so versuchen:

if (!string.IsNullOrEmpty(param.days)) 
{ 
} 

ODER

if (param.days!=NULL) 
{ 
} 
5

, Um zu klären Dies ist die Antwort auf die Frage in den Kommentaren beantworten: Warum haben die C# -Designer nicht Null auf boolesche Auswertung zu implementieren, während C++ dies erlaubt.

von Eric Lippert Beitrag Taken „null is not false“:

Einige Sprachen Nullwert von Werttypen oder Referenztypen zulassen oder beide, implizit als Boolesche Werte behandelt werden.

Und ähnlich für nullable Werttypen; In einigen Sprachen wird ein Nullwert Typ implizit als "false" behandelt.

Die Designer von C# berücksichtigten diese Funktionen und lehnten sie ab. Erstens, weil die Behandlung von Referenzen oder nullbaren Werttypen als Booleans ein verwirrendes Idiom und eine potentielle reiche Fehlerquelle ist. Und zweitens, weil semantisch es scheint anmaßend, null zu übersetzen - was bedeuten sollte "dieser Wert fehlt" oder "dieser Wert ist unbekannt" - zu "dieser Wert ist logisch falsch".

Dieser spezielle Satz umfasst Ihr string Beispiel, aber nichts von anderen Typen mit impliziter boolescher Auswertung.

Allerdings könnte man den Grund vermuten, dass Dinge wie Ganzzahlen, die nicht zu Boolean zählen, auch unter dem Banner eines schlechten Idioms oder zu anmaßend fallen.

Verwandte Themen