In C # kann ein bedingter Operator nicht implizit auf einen Nullable-Typ umgewandelt werden
Ich bin neugierig, warum Sie einen impliziten cast schlägt fehl...
int? someValue = SomeCondition ? ResultOfSomeCalc() : null;
und warum muss ich führen Sie eine explizite Umwandlung statt
int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;
Scheint es mir, hat der compiler alle Informationen die Sie benötigen, um eine implizite Typumwandlung Entscheidung, nicht?
InformationsquelleAutor der Frage Tim Jarvis | 2008-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechenden Abschnitt des C# - 3.0-Spezifikation ist 7.13, dass der bedingte operator:
Den zweiten und Dritten Operanden des ?: operator control den Typ des bedingten Ausdrucks. Seien X und Y werden die Arten der zweiten und Dritten Operanden. Dann,
Wenn X und Y sind vom gleichen Typ sind, dann ist dies der Typ des bedingten
Andernfalls, wenn eine implizite Konvertierung (§6.1) existiert, von X zu Y, aber nicht von Y auf X, dann ist Y der Typ des bedingten Ausdrucks.
Andernfalls, wenn eine implizite Konvertierung (§6.1) existiert von Y auf X, nicht aber von X nach Y, dann X ist der Typ des bedingten Ausdrucks.
Andernfalls werden keine expression-Typ bestimmt werden kann, und eine compile-time Fehler tritt auf.
InformationsquelleAutor der Antwort Brian Liang
Ich bin auch genervt, dass es nicht den Typ abzuleiten, basierend auf der Zuordnung, vor allem, wenn es einen Wert geben. Es gibt Gründe, aber wenn Sie sich ins Objekt heirarchies.
Wenn "ResultOfSomeCalc()" zurückgegeben "int?", dann das würde funktionieren. C# braucht, um herauszufinden, die Art, unabhängig davon, was auf der linken Seite der Zuweisung. Also, Sie sagen es, du wirst wieder eine null oder ein int - und die Logik im compiler existiert nicht, um es ersetzen eine null als Nenner.
Beachten Sie, dass diese Varianten nicht funktionieren, und es kann Ihnen helfen, zu verstehen:
Hoffe, das hilft.
InformationsquelleAutor der Antwort TheSoftwareJedi
Es scheint sicher, dass dies ist etwas, was der compiler sollte in der Lage sein, um herauszufinden, für sich selbst, aber es gibt einen anderen Weg, dies zu tun, die mithilfe des default-Schlüsselwortes. Es kann sein das kleinste bisschen weniger hässlich als die Darsteller:
Diese Verwendung der Standard scheint es nicht zu sein, gut dokumentiert, aber funktioniert nicht. Zumindest ist es hält Sie davon ab, zu verunreinigen Ihren code mit magic values (behaupte ich, dass null/null/false/etc. in der Tat sind Magie-Werte).
InformationsquelleAutor der Antwort Mr. Putty
Siehe auch Warum ist dieser code ungültig in C#?
InformationsquelleAutor der Antwort harpo
Wenn Ihre Funktion ResultofSomeCalc() returns int? dann funktioniert das.
Wenn Ihr Funktion gibt int, und der compiler warnt:
Typ des bedingten Ausdrucks kann nicht bestimmt werden, denn es gibt keine implizite Konvertierung zwischen " int " und "
Ich vermute, dass ist das, was Sie sehen. Beide Ausdrücke in der Bedingungsoperator "?:" müssen den gleichen Typ, oder muss das Cabrio auf den gleichen Typ über einen impliziten cast.
Ändern Sie den Rückgabetyp der ResultOfSomeCalc, int?, oder müssen Sie die Form auf der null-Ausdruck.
InformationsquelleAutor der Antwort
Machen Sie Ihre Funktion ResultOfSomeCalc()'s, die den Rückgabetyp nullabel int wie (int?)
int? Wert =(int?) SomeCondition ? ResultofSomeCalc() : (int?)null;
InformationsquelleAutor der Antwort Abdus Salam Azad