2010-06-11 6 views
0

Possible en double:
Nullable types and the ternary operator. Why won’t this work?C# Nullable Type de question

par exemple:

int? taxid; 
if (ddlProductTax.SelectedValue == "") { 
    taxid = null; } 
else { 
    taxid = Convert.ToInt32(ddlProductTax.SelectedValue); 
} //Correct 

Mais

int? taxid; 
taxid = (ddlProductTax.SelectedValue == "" ? null : Convert.ToInt32(ddlProductTax.SelectedValue)); //Error 

Il erreur dire et int32 ne peut pas convertir implicitement.

Le (truepart: falsepart); n'est pas court de (si ..else ..)?

+0

@Gishu, copie exacte, je dirais. @TatMing vérifier la réponse à la copie liée. – Paolo

+0

Eric Lippert a couvert ceci dans un article de blog récent: [http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive-law. aspx] (http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive-law.aspx) – benPearce

Répondre

4

Les deux derniers opérandes de l'opérateur ternaire doit céder à la fois du même type.

Cast de chaque côté à int?:

taxid = ddlProductTax.SelectedValue == "" ? 
           (int?)null 
           : Convert.ToInt32(ddlProductTax.SelectedValue); 

Vous pouvez voir le comportement exact dans le cahier des charges:

0

Appliquer cette correction et cela devrait fonctionner.

int? taxid; 
taxid = (ddlProductTax.SelectedValue == "" ? null : new int?(Convert.ToInt32(ddlProductTax.SelectedValue))); //Now it works. 
0

Voici une méthode peu d'aide

taxid = GetNullableInt32(ddlProductTax.SelectedValue); 

public static int? GetNullableInt32(string str) 
{ 
     int result; 
     if (Int32.TryParse(str, out result)) 
     { 
      return result; 
     } 
     return null; 
} 
0

Je pense que c'est jusqu'à la manière dont les expressions sont évaluées. Avec la ? : construire à la fois des résultats doivent evaulate au même type et ici il n'y a pas de conversion implicite entre la valeur null et un Int32.

Essayez:

taxid = (ddlProductTax.SelectedValue == "")? Convert.ToInt32(null) : Convert.ToInt32(ddlProductTax.SelectedValue); 
Questions connexes