Affectation d’opérateur conditionnelle avec les types Nullable ?

EmployeeNumber = ssortingng.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : Convert.ToInt32(employeeNumberTextBox.Text), 

Je me trouve souvent à vouloir faire des choses comme ça ( EmployeeNumber est un Nullable car c’est une propriété sur un object dbml LINQ-to-SQL où la colonne autorise les valeurs NULL). Malheureusement, le compilateur estime que “Il n’y a pas de conversion implicite entre ‘null’ et ‘int'”, même si les deux types seraient valides dans une opération d’affectation à un entier nullable.

L’opérateur de coalescence Null n’est pas une option pour autant que je sache, à cause de la conversion en ligne qui doit avoir lieu sur la chaîne .Text si ce n’est pas NULL.

Pour autant que je sache, le seul moyen d’y parvenir est d’utiliser une instruction if et / ou de l’assigner en deux étapes. Dans ce cas particulier, je trouve cela très frustrant car je voulais utiliser la syntaxe de l’initialiseur d’object et cette affectation serait dans le bloc d’initialisation …

Quelqu’un connaît-il une solution plus élégante?

Le problème se produit car l’opérateur conditionnel ne regarde pas comment la valeur est utilisée (affectée dans ce cas) pour déterminer le type de l’expression – juste les valeurs true / false. Dans ce cas, vous avez un null et un Int32 , et le type ne peut pas être déterminé (il y a de vraies raisons pour lesquelles il ne peut pas simplement supposer Nullable ).

Si vous voulez vraiment l’utiliser de cette manière, vous devez convertir l’ une des valeurs en Nullable , afin que C # puisse résoudre le type:

 EmployeeNumber = ssortingng.IsNullOrEmpty(employeeNumberTextBox.Text) ? (int?)null : Convert.ToInt32(employeeNumberTextBox.Text), 

ou

 EmployeeNumber = ssortingng.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : (int?)Convert.ToInt32(employeeNumberTextBox.Text), 

Je pense qu’une méthode utilitaire pourrait aider à rendre ce nettoyeur plus propre.

 public static class Convert { public static T? To(ssortingng value, Converter converter) where T: struct { return ssortingng.IsNullOrEmpty(value) ? null : (T?)converter(value); } } 

puis

 EmployeeNumber = Convert.To(employeeNumberTextBox.Text, Int32.Parse); 

Bien qu’Alex fournisse la réponse correcte et proximale à votre question, je préfère utiliser TryParse :

 int value; int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value) ? (int?)value : null; 

C’est plus sûr et prend en charge les cas de saisie non valide ainsi que votre scénario de chaîne vide. Sinon, si l’utilisateur saisit quelque chose comme 1b une page d’erreur avec l’exception non Convert.ToInt32(ssortingng) sera présentée dans Convert.ToInt32(ssortingng) .

Vous pouvez lancer la sortie de Convert:

 EmployeeNumber = ssortingng.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : (int?)Convert.ToInt32(employeeNumberTextBox.Text) 
 //Some operation to populate Posid.I am not interestd in zero or null int? Posid = SvcClient.GetHolidayCount(xDateFrom.Value.Date,xDateTo.Value.Date).Response; var x1 = (Posid.HasValue && Posid.Value > 0) ? (int?)Posid.Value : null; 

EDIT: Brève explication de ce qui précède, j’essayais d’obtenir la valeur de Posid (si son nonnull int et ayant une valeur supérieure à 0) dans varibale X1 . J’ai dû utiliser (int?) Sur Posid.Value pour que l’opérateur conditionnel ne Posid.Value aucune erreur de compilation. Juste un FYI GetHolidayCount est une méthode WCF qui pourrait donner un nombre null ou n’importe quel nombre. J’espère que cela pourra aider