2015-06-04 11 views
5

Mit Blick auf die ?? Definition sagt, wenn angewendet, gibt linken Operanden zurück, wenn es nicht null oder der rechte Operand ist. Aber warum funktioniert das nicht?Verwendung von ?? zwischen Nullable <int> und String

int? i = null; 
string s = i ?? "some string"; 

Ist es erforderlich, dass Nullable-Typ mit dem richtigen Operandentyp übereinstimmt?

+0

Können Sie sich darüber im Klaren sein, was im Vergleich zu dem passiert, was Sie erwarten? – BSMP

+3

Was ist, wenn 'i' nicht' null' ist? Sie wissen, 'int' kann nicht' string' zugewiesen werden. – Dmitry

Antwort

7

?? ist eine syntaktische Zucker (in diesem Fall) für die folgende logische Anweisung.

int? i = null; 
string s = null; 

if (i != null) 
{ 
    s = i; 
} 
else 
{ 
    s = "some string"; 
} 

Offensichtlich ist der Compiler würde dies niemals akzeptieren und es würde nicht kompilieren, da ich nicht implizit s gegossen werden kann. Der Compiler macht keine Ausnahme für Null-Koaleszenzoperatoren und erzwingt die Typanforderung.

Wenn Sie unbedingt einen Null-Koaleszenzoperator für gemischte Typen in einer einzelnen Zeile verwenden möchten, müssen Sie eine Typkonvertierung über eine andere Methode durchführen.

Sie können einfach nicht i.ToString() nennen, da dies eine leere Zeichenfolge anstelle von null zurück, wenn i null ist, wird eine leere Zeichenfolge verursacht zu s statt „some string“ zugewiesen werden. Als Ergebnis würden Sie so etwas wie die folgende generische Erweiterungsmethode benötigen:

public static string ToNullableString<T>(this Nullable<T> nullable) where T : struct 
{ 
    return nullable == null ? null : nullable.ToString(); 
} 

, die wie so verwendet werden könnten:

int? i = null; 
string s = i.ToNullableString() ?? "some string"; 

s würde der Wert „eine Schnur“, da die Erweiterungsmethode zugeordnet werden würde den nullbaren Wert korrekt beibehalten, sodass der Nullkoaleszenzoperator die Nicht-Null-Alternative auswählen kann.

+0

Danke für die Erklärung. –

+0

@ DanielJabsøn Gern geschehen :). Wenn es Ihnen geholfen hat, wird eine akzeptierte Antwort immer sehr geschätzt. –