web-dev-qa-db-fra.com

c # pourquoi une int nullable ne peut-elle être affectée à null en tant que valeur

Expliquez pourquoi on ne peut pas affecter la valeur null à un entier nullable

int? accom = (accomStr == "noval" ? null  : Convert.ToInt32(accomStr));

Quel est le problème avec ce code?

121
mancmanomyst

Le problème n'est pas que null ne peut pas être assigné à un int ?. Le problème est que les deux valeurs renvoyées par l'opérateur ternaire doivent être du même type, sinon l'une des deux doit être implicitement convertible. Dans ce cas, null ne peut pas être converti implicitement en int ni vice-versus, une conversion explicite est donc nécessaire. Essayez ceci à la place:

int? accom = (accomStr == "noval" ? (int?)null : Convert.ToInt32(accomStr));
235
Harry Steinhilber

Ce que dit Harry est tout à fait juste, mais

int? accom = (accomStr == "noval" ? null : (int?)Convert.ToInt32(accomStr));

ferait aussi l'affaire. (Nous, les utilisateurs de Resharper, pouvons toujours nous repérer dans la foule ...)

40
Will Dean

Une autre option est d'utiliser

int? accom = (accomStr == "noval" ? Convert.DBNull : Convert.ToInt32(accomStr); 

J'aime celui-ci le plus.

6
Genius

De même, j'ai longtemps fait:

myLongVariable = (!string.IsNullOrEmpty(cbLong.SelectedItem.Value)) ? Convert.ToInt64(cbLong.SelectedItem.Value) : (long?)null;
1
tenss