Set Nullable-Eigenschaft standardmäßig auf den Wert Nothing nicht funktioniert wie gewünscht
Ich habe eine Eigenschaft, die Art ist Nullable
von Integer
einen default-Wert Nothing
wie unten gezeigt:
Property TestId As Integer? = Nothing
folgende code wertet die Eigenschaft TestId zu Nichts (wie gewollt)
Dim test As RadTreeNode = rtvDefinitionCreate.FindNodeByValue(DefinitionHeaderEnum.Test)
If test Is Nothing Then
definition.TestId = Nothing
Else
definition.TestId = test.Nodes(0).Value
End If
aber den code unten bewertet als 0 (default-Wert für Integer
, auch wenn es Integer?
mit default-Wert Nothing
)
Dim test As RadTreeNode = rtvDefinitionCreate.FindNodeByValue(DefinitionHeaderEnum.Test)
definition.TestId = If(IsNothing(test), Nothing, test.Nodes(0).Value)
Was ist falsch mit dem obigen code? Keine Hilfe??
(später in der code beim Aufruf der Eigenschaft, die Eigenschaft ist 0)
InformationsquelleAutor ddieppa | 2012-07-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es, weil Sie kompilieren Sie den code mit
Option Strict Off
.Wenn Sie Ihren code kompilieren mit
Option Strict On
, würde der compiler Ihnen einen Fehler, der Ihnen mitteilt, dass es nicht umwandeln kann vonString
zuInteger?
, die Vermeidung von solchen überraschungen zur Laufzeit.Dies ist eine Seltsamkeit bei der Verwendung
properties
/ternary operator
/option strict off
im VB.NET.Betrachten Sie den folgenden code:
Anderen Unterschied zu beachten:
bewerten zu
Nothing
aberbewerten zu
0
Können Sie erstellen, die eine Erweiterung Methode zu tun, die unangenehme arbeiten für Sie.
- und nennen es wie
Option Strict On
hier nicht helfen, da der If-operator bewirkt eine automatische erweiternde Konvertierung aus dem Nichts auf 0 (Arttest.Nodes(0).Value
) - aber die Lösung sollte funktionieren!Strict würde helfen, hier in den Weg, verursacht einen Kompilierungsfehler, Hervorhebung das problem.
Für mich
Dim i As Integer? = If(True, Nothing, 1)
führt nicht zu einem compile-Fehler, sondern wandelt Nichts um 0 und dann 0, um eine null-0.Ja, das ist wahr. Die Argumente Ihrer ternär sind
Nothing
und1
.1
ist eine ganze Zahl, undNothing
können in eine ganze Zahl konvertiert (0
), damit der compiler glücklich ist und weiß der tenäre operator wird eine Ganzzahl zurück. Aber versuchenDim i As Integer? = If(True, Nothing, "SomeString")
. Der compiler wird eine Fehlermeldung ausgeben, wennOption Strict On
.nun, ich habe
definition.TestId = If(IsNothing(test), new Integer?, CType(test.Nodes(0).Value,Integer))
und es funktioniert, aber zu schreiben zu viel code, irgendeine elegante Lösung?InformationsquelleAutor sloth