2016-05-15 13 views
0

Raten Sie das Ergebnis i:Nullable Typ Rückschluss in Visual Basic - ist es irgendwo dokumentiert und kann es strenger gemacht werden?

Dim i As Integer? = If(True, Nothing, 3) 

Antwort: 0

Wenn Sie erwarten, Nothing zu bekommen, müssen Sie die Integer-Argument ändern:

Dim i As Integer? = If(True, Nothing, New Nullable(3)) 

Wie Sie sehen können , Rückschluss auf den Ergebnistyp vom 2. und 3. Parameter bevorzugt T vor Nullable(Of T). Für mich wäre logisch das Gegenteil.

Wo finden sich diese Inferenz-/Priorisierungsregeln der Typen (speziell von Nullable) dokumentiert? Ich überprüfte Hilfe für type inference, Nullable und If, aber ich kann nichts finden.

Ein Blick zu den Nachbarn: (schön) weigert sich, das Äquivalent

int? i = true ? null : 3; 

mit Fehler

CS0173 Art des bedingten Ausdruck zu kompilieren kann nicht bestimmt werden, weil es keine implizite Konvertierung ist '<null>' zwischen und 'int'

was sicher ist und vermeidet fallen in den Fang zu sehen n in der . Aber in der VB, sogar Option Infer Off + Option Strict On haben keine Fehler-werfen-Effekt, der Programmierer vor unbemerkten Fehlern speichern könnte. Oder gibt es eine Möglichkeit, auch im einen Fehler zu erzeugen?

+0

@GSerg - hah, ich habe mich immer gewundert, ob ein gültiger Grund dafür bestehen kann, dass ich für das Schließen meiner eigenen Frage stimmen werde. Jetzt habe ich gewählt ... – miroxlav

Antwort

0

Okay, jetzt verstehe ich besser. Der Schuldige ist in der Interpretation von Nothing.

Änderung Nothing auf „true“ null führt Ergebnis zu korrigieren:

Dim i As Integer? = If(True, New Nullable(Of Integer), 3) 

Ergebnis: i Is Nothing

so das mögliche Problem war, dass Nothing scheint durch den Compiler als Standardwert für die ersten zu betracht anderer Typ (Integer) als ein null. Ändern seiner impliziten Bedeutung hilft. Ein kniffliger Punkt sowieso. Wenn jemand dies dokumentiert finden kann, wäre es nett. (Ich bestehe nicht auf dieser Antwort.) Es wird großartig sein, wenn die VB gezwungen werden kann, einen Fehler oder eine Warnung zu werfen, wenn dies geschieht, ähnlich wie C#.


Wie an anderer Stelle in comment gesehen, kann eine schönere Form Notation existieren:

Dim i As Integer? = If(True, Integer?, 3) 

Nice!

+0

Das hätte auch funktioniert - Dim i As Integer? = If (True, Nothing, Neue Nullable (Of Integer) (3)) – dbasnett