2009-05-28 15 views
4

Ich schreibe nur ein wenig Code, um eine ID von Integer mit einer ID von Integer zu vergleichen? zum Beispiel:Vergleichen von Integer und Integer? ergibt Boolean? nicht Boolean

Dim id As Integer = 1 
Dim nullId As Integer? = Nothing 
Dim areEqual As Boolean 
areEqual = nullId = id 

Wenn ich versuche, den Code ich einen Compiler-Fehler zu kompilieren:

Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'. 

Während es sehr einfach für mich, dies zu umgehen, ich habe gehofft, dass jemand in der Lage sein könnte, Erklären Sie, was im Compiler passiert, um diese Warnung zu geben.

Antwort

7

Es ist eine der Macken von Nullable-Typen. NULL (allgemein ausgedrückt) bedeutet "Weiß nicht". Vergleichen bekannt mit unbekannt Ergebnisse in unbekannt (weil Sie nicht wissen, ob sie gleich sind).

Es ist das gleiche mit Nullable-Typen in .NET. Vergleicht man eine Integer? mit einer Integer ergibt sich eine , weil Sie True, False oder "weiß nicht" erhalten können.

+0

Was ist mit FileNotFound? ;-) –

+0

Für diejenigen, die die Referenz verpasst haben: http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx –

3

Dies ist eine unglückliche Konsequenz der Art und Weise, wie der Compiler die Operatoren für Nullable-Typen generiert. Sie können mit den folgenden Code um es:

Dim AreEqual As Boolean = If(nullId, 0) = id 

Die If hier entspricht C# 's null coalesce operator und ist eine Abkürzung für:

Dim AreEqual As Boolean = If(nullId.HasValue, nullId.Value, 0) = id 
0

Sie versuchen, einen Typ (integer) auf eine vergleichen Nullable Typ (Integer?).

Sie müssen den tatsächlichen Wert von nullID überprüfen, aber vergessen Sie nicht, dass Sie überprüfen müssen, ob nullId null ist.

0

Der Compilerfehler tritt auf, weil Option Strict On implizite Konvertierungen von 'Boolean?' zu 'Boolean'. Und du versuchst einen Booleschen? (das Ergebnis von 'Integer?' = 'Integer') zu einem 'Boolean'.

Implizite Konvertierungen sind in Sprachstandards normalerweise deaktiviert, um unbeabsichtigte Fehler zu vermeiden. Das Hinzufügen einer expliziten Konvertierung ist einfach. Finden Sie heraus, welche implizite Umwandlung Sie in Ihren Code eingeben, ohne zu wissen, dass es schwierig sein könnte.

Ein Nullable-Typ und ein normaler Typ sind unterschiedlich genug, um implizite Konvertierungen zwischen ihnen zu vermeiden.

+1

Ich denke, Sie haben das Fleisch der Frage verpasst, befasst sich der Code mit Integer und Integer ?, der Fehler berichtet, ist für Boolean? –

+0

"Ganzzahl = Ganzzahl?" führt zu einem "boolean?", und der Benutzer versucht, es einem "boolean" zuzuweisen. Aber ja, ich hatte dieses Detail in erster Linie verpasst :) –

0

Null hat den Wert "Ich weiß nicht, was der Wert ist" und per Definition führt jede Operation, bei der einer der Operanden null ist, zu null. Z.B. 2 = null ergibt null und daher der resultierende Wert von int = int? muss null als möglichen Wert haben und nicht nur die Werte wahr und falsch haben. bool? ist der Typ, der genau diese Menge von Werten hat und daher der Rückgabetyp der Operation ist.

Die einzigen zulässigen impliziten Umwandlungen sind diejenigen, die immer funktionieren. Sie können implizit einen Int in einen langen String umwandeln. aber nicht lange bis zu einem int (das kann man explizit tun), weil letzteres zum Verlust von Informationen führen könnte. wenn die Anzahl größer als int.MaxValue ist. In diesem Fall würden Sie versuchen, einen NULL-Wert aufzuheben, der zu einer Laufzeitausnahme führen würde.

Verwandte Themen