Question

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

J'ai souvent envie de faire des choses comme celle-ci ( EmployeeNumber est un Nullable < int > , car il s'agit d'une propriété d'un objet dbml LINQ-to-SQL où colonne autorise les valeurs NULL). Malheureusement, le compilateur estime qu'il n'y a pas de conversion implicite entre 'null' et 'int' ', même si les deux types seraient valables dans une opération d'affectation vers un int nullable.

L'opérateur de coalescence nul n'est pas une option à ma connaissance en raison de la conversion en ligne qui doit avoir lieu sur la chaîne .Text si elle n'est pas nulle.

Pour autant que je sache, la seule façon de procéder consiste à utiliser une instruction if et / ou à l'attribuer en deux étapes. Dans ce cas particulier, je trouve cela très frustrant car je voulais utiliser la syntaxe d’initialisation d’objet et cette affectation se trouverait dans le bloc d’initialisation ...

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

Était-ce utile?

La solution

Le problème se produit car l'opérateur conditionnel n'envisage pas l'utilisation de la valeur (affectée dans ce cas) pour déterminer le type de l'expression - uniquement les valeurs true / false. Dans ce cas, vous avez un null et un Int32 , et le type ne peut pas être déterminé (il existe de vraies raisons pour lesquelles il ne peut pas supposer simplement Nullable < Int32 > ; ).

Si vous souhaitez vraiment l'utiliser de cette manière, vous devez attribuer l'une des valeurs à Nullable < Int32 > , afin que C # puisse résoudre le type:

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

ou

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

Autres conseils

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

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

puis

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

Alors qu'Alex fournit 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 gère les cas d'entrées non valides ainsi que votre scénario de chaîne vide. Sinon, si l'utilisateur entre quelque chose comme 1b , une page d'erreur avec l'exception non gérée provoquée dans Convert.ToInt32 (string) sera présentée.

Vous pouvez convertir la sortie de Convert:

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
   ? null
   : (int?)Convert.ToInt32(employeeNumberTextBox.Text)
//Some operation to populate Posid.I am not interested 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 non-code int et sa valeur supérieure à 0) dans varibale X1 . Je devais utiliser (int?) sur Posid.Value pour obtenir l'opérateur conditionnel ne générant aucune erreur de compilation. Juste un FYI GetHolidayCount est une méthode WCF qui pourrait donner null ou un nombre quelconque. Espérons que cela aide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top