Warum ist dieser Code in C # ungültig?

Folgende code wird nicht kompiliert:

string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;

Bekomme ich: Fehler 1 der Typ des bedingten Ausdrucks kann nicht bestimmt werden, denn es gibt keine implizite Konvertierung zwischen " System.DBNull' und 'string'

Um dies zu beheben, muss ich tun so etwas wie dieses:

string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;

Dieser Besetzung scheint sinnlos, da dies sicherlich zu Recht:

string foo = "bar";
Object o = foo == null ? "gork" : foo;

Scheint es mir, dass, wenn die ternäre Verzweigungen sind von verschiedenen Arten, wird der compiler nicht autobox die Werte für das type-Objekt...aber wenn Sie vom gleichen Typ sind dann die autoboxing automatisch.

In meinem Kopf die erste Anweisung sollte legal sein...

Kann mir jemand beschreiben, warum der compiler dies nicht erlaubt, und warum die Entwickler von C# entschieden, dies zu tun? Ich glaube, dies ist legal in Java...Obwohl ich nicht bestätigt haben.

Dank.

EDIT: bitte ich um ein Verständnis dafür, warum Java und C# behandeln Sie diese anders, was Los ist hinter den kulissen in C# machen diesen ungültig. Ich weiß, wie Sie ternär, und bin nicht auf der Suche nach einem "besseren Weg" zum code der Beispiele. Ich verstehe die Regeln des ternären in C#, aber ich will wissen, WARUM...

BEARBEITEN (Jon Skeet): Entfernt "autoboxing" - tag, da keine Boxen beteiligt ist, in dieser Frage.

InformationsquelleAutor der Frage mmattax | 2008-10-14

Schreibe einen Kommentar