Domanda

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

Spesso mi ritrovo a voler fare cose del genere (EmployeeNumber è un Nullable<int> poiché è una proprietà su un oggetto dbml LINQ-to-SQL in cui la colonna consente valori NULL).Sfortunatamente, il compilatore ritiene che "non esiste una conversione implicita tra 'null' e 'int'", anche se entrambi i tipi sarebbero validi da soli in un'operazione di assegnazione a un int nullable.

L'operatore di coalescenza null non è un'opzione per quanto posso vedere a causa della conversione in linea che deve avvenire sulla stringa .Text se non è null.

Per quanto ne so, l'unico modo per farlo è utilizzare un'istruzione if e/o assegnarla in due passaggi.In questo caso particolare lo trovo molto frustrante perché volevo utilizzare la sintassi dell'inizializzatore di oggetto e questa assegnazione sarebbe nel blocco di inizializzazione...

Qualcuno conosce una soluzione più elegante?

È stato utile?

Soluzione

Il problema si verifica perché l'operatore condizionale non esamina il modo in cui viene utilizzato il valore (assegnato in questo caso) per determinare il tipo dell'espressione, ma solo i valori vero/falso.In questo caso, hai a nullo e un Int32, e il tipo non può essere determinato (ci sono ragioni reali per cui non può semplicemente assumere Nullable<Int32>).

Se vuoi davvero usarlo in questo modo, devi eseguire il cast di uno dei valori Nullable<Int32> te stesso, quindi C# può risolvere il tipo:

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

O

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

Altri suggerimenti

Penso che un metodo di utilità potrebbe aiutare a renderlo più pulito.

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);
    }
}

Poi

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

Sebbene Alex fornisca la risposta corretta e prossimale alla tua domanda, preferisco usare TryParse:

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

È più sicuro e si prende cura dei casi di input non validi e dello scenario di stringa vuota.Altrimenti se l'utente inserisce qualcosa di simile 1b verrà loro presentata una pagina di errore con l'eccezione non gestita causata Convert.ToInt32(string).

Puoi trasmettere l'output di 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;

MODIFICARE:Breve spiegazione di quanto sopra, stavo cercando di ottenere il valore di Posid (se non è nullo int e avente valore maggiore di 0) in varibale X1.dovevo usare (int?) SU Posid.Value per fare in modo che l'operatore condizionale non generi alcun errore di compilazione.Solo per vostra informazione GetHolidayCount è un WCF metodo che potrebbe dare null o qualsiasi numero.Spero possa aiutare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top