Ternärer Operator VB vs C #: Warum löst Nothing auf Null?
Ich nur Shooting selbst in den Fuß und würde gerne wissen, ob es tatsächliche Gründe, um diese situation möglich.
Und sowieso, diese Frage kann für die Bequemlichkeit der Zukunft Fuß zu schützen.
Nehmen wir an, wir haben eine null-Wert in vb.net:
Dim i as Integer?
Wollen wir einen Wert zuweisen, basierend auf einem Zustand, und mit ein ternärer operator, weil er so ordentlich und Sachen:
i = If(condition(), Nothing, 42)
Ist, wenn eine Bedingung true
beschäftigen, die null-Zulässigkeit, ansonsten der Wert.
An welchem Punkt der Dreharbeiten stattfindet. Ohne ersichtlichen Grund, VB compiler entscheidet, dass die gemeinsame Basis geben für Nothing
und Integer
ist Integer
, an welcher Stelle es im hintergrund übersetzt die Anweisung:
i = If(condition(), 0, 42)
Nun, wenn Sie wurden zu diesem Zweck in C#:
i = (condition()) ? null : 42;
Würden Sie sofort ein compiler-Fehler sagen, dass <null>
nicht gut mischen mit int
. Die ist toll, da mein Fuß hätte gesündere hatte, ging ich in die C# - übrigens dieses mal. Und für dieses zu kompilieren, müssen Sie ausdrücklich schreiben:
i = (condition()) ? null : (int?)42;
Nun, Sie kann tun das gleiche in VB und Holen Sie sich die richtige null-ness, die Sie erwarten würden:
i = If(condition(), Nothing, CType(42, Integer?))
Aber das erfordert, dass Ihr Fuß Schoß in den ersten Platz. Es gibt keinen compiler-Fehler, und es gibt keine Warnung. Das ist mit Explicit On
und Strict On
.
Also meine Frage ist, warum?
Sollte ich diese nehmen, da ein compiler-bug?
Oder kann jemand erklären, warum der compiler diese Weise verhält?
InformationsquelleAutor der Frage GSerg | 2010-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, weil VB ist
Nothing
ist nicht eine direkte Entsprechung in C#'snull
.Beispielsweise in C# dieser code wird nicht kompilieren:
Aber das VB.Net code funktioniert Prima:
VB.Net's
Nothing
ist eigentlich ein näher match für C#'sdefault(T)
Ausdruck.InformationsquelleAutor der Antwort Joel Coehoorn
Den ternären operator kann nur eine geben.
In C#, versucht es, wählen Sie einen Typ, basierend auf
null
und42
. Gut,null
nicht geben, so entscheidet es, dass der Rückgabetyp der ternäre operator ist, dass der42
; ein plain oldint
. Dann beschwert es sich, weil Sie nicht mehr zurück können Sie null als eine einfache alteint
. Wenn Sie zwingen die 42 alsint?
der ternäre operator ist wieder einint?
sonull
's gültig.Nun, ich weiß nicht, wie VB, aber Zitat aus dem MSDN,
Assigning Nothing to a variable sets it to the default value for its declared type.
Welche, da VB bestimmt, dass der ternäre operator zurück
int
(mit dem gleichen Prozess, C#) hast,Nothing
ist0
. Wieder, Zwang die42
eineint?
drehtNothing
in der default-Wert vonint?
dienull
als Sie erwartet haben.InformationsquelleAutor der Antwort Naelin
Ich denke das hat etwas mehr zu tun als WENN Nichts. Betrachten Sie diesen code:
Warum es das macht, weiß ich noch nicht, wahrscheinlich eine Frage für die VB-team. Ich glaube nicht, dass es hat zu tun mit dem Schlüsselwort Nothing oder null-Werte zu.
InformationsquelleAutor der Antwort Mike Cheel
Nothing
undnull
sind nicht das gleiche... aus dem MSDN:Auch
Beachten Sie, dass int? ist ein nullable-Typ, aber es ist immer noch ein Wert-Typ, der kein Referenztyp.
Versuchen Sie, es zu
DbNull.Value
stattNothing
...InformationsquelleAutor der Antwort James King
In einer Reihe von Fällen
Nothing
erhalten Umgerechnet auf den default-Wert. VerwendenNothing
die gleiche Weise, die Sie verwenden würdennull
müssen Sie wandeln Sie Sie in der richtigen nullable-Typ.InformationsquelleAutor der Antwort Nicholas
Dies geschieht, weil Integer keine Referenz geben. 'Nichts' ist, sollte nur Arbeit für Referenz-Typen. Für die Werttypen zuweisen, Nichts wird automatisch in der default-Wert, der im Falle eines Integer 0.
InformationsquelleAutor der Antwort Geoffrey
Dies ist eigentlich jetzt möglich in VS2015 (zumindest) durch den Einsatz von Neuen Integer?
Ex.:
InformationsquelleAutor der Antwort hunda27