Konditionaloperator Zuordnung mit Nullable Typen?
-
09-06-2019 - |
Frage
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: Convert.ToInt32(employeeNumberTextBox.Text),
Ich finde ich oft zu wollen wie diese Dinge zu tun (EmployeeNumber
ist ein Nullable<int>
, da es eine Eigenschaft ist auf einem LINQ to SQL-DBML Objekt, wo die Spalte NULL-Wert erlaubt). Leider fühlt sich der Compiler, dass „Es gibt keine implizite Konvertierung zwischen‚Null‘und‚int‘“, obwohl beiden Typen wären gültig in einer Zuweisung zu einem Nullable-int auf ihrem eigenen.
Null koaleszierende Operator wird eine Option nicht so weit wie ich wegen der Inline-Umwandlung sehen, die auf der .Text Zeichenfolge passieren muss, wenn es nicht null ist.
Soweit ich der einzige Weg, weiß, dass dies zu tun, ist ein if-Anweisung und / oder weisen Sie in zwei Schritten zu verwenden. In diesem speziellen Fall finde ich, dass es sehr frustrierend, weil ich die Objektinitialisierer Syntax und diese Zuordnung in der Initialisierungsbaustein wäre verwenden wollte ...
Wer weiß, eine elegantere Lösung?
Lösung
Das Problem tritt auf, da der bedingte Operator nicht sieht, wie der Wert verwendet wird (in diesem Fall zugewiesen) die Art des Ausdrucks zu bestimmen - nur den Wahr / Falsch-Wert. In diesem Fall haben Sie eine null und ein Int32 , und der Typ nicht bestimmt werden kann (es echte Gründe kann es nicht einfach davon ausgehen, Nullable
Wenn Sie wirklich auf diese Weise verwenden möchten, müssen Sie einen der Werte zu gieße Nullable
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? (int?)null
: Convert.ToInt32(employeeNumberTextBox.Text),
oder
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: (int?)Convert.ToInt32(employeeNumberTextBox.Text),
Andere Tipps
Ich denke, ein Dienstprogramm Methode, um diese sauberer machen helfen könnte.
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);
}
}
dann
EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);
Während Alex die richtige und proximale Antwort auf Ihre Frage stellt, ziehe ich TryParse
verwenden:
int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
? (int?)value
: null;
Es ist sicherer, und kümmert sich um Fälle von ungültiger Eingabe sowie Ihr leeren String-Szenario. Andernfalls, wenn die Benutzereingaben so etwas wie 1b
werden sie mit einer Fehlerseite mit der nicht behandelten Ausnahme verursacht in Convert.ToInt32(string)
präsentiert werden.
Sie können die Ausgabe von Convert Stimmen:
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:
Kurze Erklärung von oben, ich habe versucht, den Wert von Posid
(wenn sein ungleich NULL int
und mit einem Wert größer als 0) in Varibale X1
zu bekommen. Ich musste (int?)
auf Posid.Value
verwende den bedingte Operator nicht wirft jeden Übersetzungsfehler zu erhalten.
Nur ein FYI GetHolidayCount
ist eine Methode, die WCF
null
oder eine beliebige Anzahl geben könnte.
Hoffe, das hilft