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?

War es hilfreich?

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 selbst, so C # die Art lösen können:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top