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

Schreibe einen Kommentar