2012-04-19 16 views
5

Mögliche Duplizieren:
Bug?? If you assign a value to a nullable integer via a ternary operator, it can't become nullWas entspricht VB.NETs dem Standardschlüsselwort von C#?

Während diese Frage wie ein Duplikat von vielen erscheinen mag, ist es tatsächlich aus einem bestimmten Grund gefragt. Nehmen Sie diesen Code, zum Beispiel:

Dim n As Integer? = If(True, Nothing, 1) 

In diesem Code, den ternären Ausdruck sollte Nichts zurückkehren, aber es ist Einstellung n auf 0. Wenn diese C# waren, konnte ich default(int?) sagen und es wäre perfekt funktionieren. Jetzt sieht es so aus, als müsste ich das Ternary abbrechen und einen regulären If-Block verwenden, aber ich möchte das Ternär wirklich verwenden.

Wenn Nothing wirklich VB.NET äquivalent zu C# Standard war, wie können Sie dieses Verhalten erklären?

+0

'Nothing' in diesem Fall entspricht' default (int) ', weil Ihr abgeleiteter Typ basierend auf dem Ausdruck' int' ist, nicht 'int?'. Dies kann man mit 'If (true, Nothing, new Integer? (1))' – Marc

+0

sehen. Also kann man sicher sagen, dass VB.NET * kein Äquivalent von C# 's Standard hat. Wenn dies der Fall wäre, hätte es die Typinferenz verwenden können, um zu bestimmen, dass Nothing in diesem Fall dem Standardwert einer nullbaren Ganzzahl entspricht, der Nothing, nicht 0 ist. – oscilatingcretin

+0

In einer indirekten Weise ist das korrekt. In C# nimmt der 'default' einen Typ an, der für eine Schlussfolgerung verwendet werden kann. In VB scheint "Nothing" die passive Rolle dabei zu spielen. – Marc

Antwort

6

Die VB.NET entspricht C# default ist das Schlüsselwort Nothing. Der Code, den Sie geschrieben haben, sollte gut kompilieren, solange Id.Value einen Integer Wert zurückgibt.

Der Grund, dass Ihre aktualisierte Probe falsch läuft, liegt an der Natur von Nothing. In VB.NET Nothing ist der leere Wert und es kann in einen beliebigen Typ konvertiert werden. Nun muss der Compiler für einen If Ausdruck auf den Typ des Returns schließen, und zwar durch Betrachtung der beiden Value-Argumente. Der Wert Nothing hat keinen Typ, aber der Literal 1 hat den Typ Integer. Nothing ist in Integer konvertierbar, so dass der Compiler Integer den besten Typ hier bestimmt. Das heißt, wenn Nothing als Wert gewählt wird, wird dies als Integer interpretiert und nicht als Integer?.

Die einfachste Möglichkeit, dies zu beheben, besteht darin, dem Compiler explizit mitzuteilen, dass 1 als Integer? behandelt werden soll.

+0

In meiner Frage verwende ich Nothing im ternären Ausdruck richtig? Wenn nicht, wie würdest du es ändern, um das zu tun, was ich versuche? Haben Sie zufällig versucht, das Problem mit Ihrem eigenen Code zu reproduzieren? – oscilatingcretin

+0

@oscilatingcretin der Code, den Sie verwenden, ist in Ordnung. Ich schrieb ein Beispiel lokal und es funktionierte wie erwartet – JaredPar

+0

Okay, dann versuchen Sie den aktualisierten Code, den ich in meine Frage bearbeitet habe. Wenn Sie diese einzelne Codezeile ausführen, wird "n" wie erwartet auf Nothing gesetzt? Wenn ich es ausführe, wird es auf 0 gesetzt. – oscilatingcretin