265 Stimmen

Nullbare Typen und der ternäre Operator: Warum ist `? 10 : null" verboten?

Ich bin gerade auf einen merkwürdigen Fehler gestoßen:

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

Dann, in einer anderen Methode, etwas wie dieses:

int? x = GetBoolValue() ? 10 : null;

Einfach, wenn die Methode true zurückgibt, weisen Sie dem Nullable 10 zu int x. Andernfalls weisen Sie dem Parameter nullable int. Der Compiler beschwert sich jedoch:

Fehler 1 Der Typ des bedingten Ausdrucks kann nicht bestimmt werden, da es keine implizite Konvertierung zwischen int y <null> .

Bin ich verrückt geworden?

441voto

LukeH Punkte 251752

Der Compiler versucht zunächst, den rechten Ausdruck auszuwerten:

GetBoolValue() ? 10 : null

Le site 10 ist ein int wörtlich (nicht int? ) und null ist, nun ja, null . Es gibt keine implizite Konvertierung zwischen diesen beiden, daher die Fehlermeldung.

Wenn Sie den Ausdruck auf der rechten Seite in einen der folgenden Ausdrücke ändern, lässt er sich kompilieren, da es eine implizite Umwandlung zwischen int? y null (#1) und zwischen int y int? (#2, #3).

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3

38voto

Andrew Hare Punkte 332190

Versuchen Sie dies:

int? x = GetBoolValue() ? 10 : (int?)null;

Das Problem besteht darin, dass der bedingte Operator nicht in der Lage ist, den "Rückgabetyp" des Ausdrucks zu bestimmen. Da der Compiler stillschweigend entscheidet, dass 10 ist ein int entscheidet er dann, dass der Rückgabetyp dieses Ausdrucks ein int auch. Da eine int kann nicht sein null (der dritte Operand des bedingten Operators) wird beanstandet.

Durch die Besetzung der null を、その Nullable<int> sagen wir dem Compiler ausdrücklich, dass der Rückgabetyp dieses Ausdrucks ein Nullable<int> . Sie hätten genauso gut die 10 a int? und hatte die gleiche Wirkung.

15voto

Eric Lippert Punkte 628543

Übrigens, die Microsoft-Implementierung des C#-Compilers macht die Typanalyse des bedingten Operators auf eine sehr subtile und (für mich) interessante Weise falsch. Mein Artikel dazu lautet Probleme bei der Typeninferenz, Teil eins (2006-05-24).

15voto

Unknown Punkte 721

Versuchen Sie dies:

int? result = condition ? 10 : default(int?);

5voto

John Gietzen Punkte 47223

Versuchen Sie eine von diesen:

int? x = GetBoolValue() ? (int?)10 : null;

int? x = GetBoolValue() ? 10 : (int?)null;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X