2009-11-13 12 views
12

esiste un modo per restituire null se non è in grado di analizzare una stringa su int?int.TryParse = null se non numerico?

con:

public .... , string? categoryID) 
{ 
int.TryParse(categoryID, out categoryID); 

ottenere "non può convertire da 'stringa out' a 'fuori int'

cosa fare

EDIT:?

non è più rilevante a causa della vincoli asp.net è il modo per risolvere il problema

/M

+2

Perché lo si analizza in un int quando si desidera memorizzarlo in una stringa ?? –

+2

A proposito, string è un tipo di riferimento, quindi non dovresti renderlo nullable. (questo compila comunque?) –

+0

Io lo uso per asp.net mvc quindi il categoryID è mappato dall'url, quindi ottengo errore se passo nella stringa in url –

risposta

24

Prima di tutto, perché stai cercando di analizzare una stringa in un int e bastone il risultato di nuovo in una stringa?

La firma del metodo è

bool int.TryParse(string, out int) 

quindi bisogna dare una variabile di tipo int come secondo argomento. Questo significa anche che non otterrai null se l'analisi fallisce, invece il metodo restituirà semplicemente false. Ma puoi facilmente metterlo insieme:

int? TryParse2(string s) { 
    int i; 
    if (!int.TryParse(s, out i)) { 
     return null; 
    } else { 
     return i; 
    } 
} 
+0

Eep, grazie, Garry. Scrivere codice senza mai compilarlo invita errori come quelli :-) – Joey

+1

Scommetto che questo sarebbe un buon metodo di estensione – cost

0

** questa risposta è stata rifiutata molto ** Anche se è una possibile soluzione, è una cattiva prestazione in termini di prestazioni e probabilmente non una buona scelta di programmazione.

non voglio cancellarlo, come immagino molti programmatori potrebbero non essere consapevoli di questo, ecco un esempio di come non fare le cose:

utilizzo cercare di catturare

try 
{ 
res = Int32.Parse(strVAR) 
} 
catch(exception ex) 
{ 
return null; 
} 
+1

Meglio usare 'TryParse'. – jason

+0

Bene, questa è ancora un'opzione .... – Dani

+1

Da quando C# 2.0 è uscito, TryParse è quasi sempre meglio che fare il catch di eccezione. – Bomlin

0

Int è un tipo di valore che significa che non esiste nulla come int nullo. Quindi no, TryParse non modificherà mai il parametro out in modo che sia nullo.

Ma il problema che si sta verificando è che si passa una stringa al parametro out di TryParse quando è in attesa di un numero intero.

Hai bisogno di qualcosa di simile ...

Int categoryID = 0; 
string strCategoryID = "somestringmaybeitsaninteger"; 

int.TryParse(strCategoryID, out categoryID); 
+0

C'è un valore nullable int: int? – Dani

+0

Dani: 'TryParse' tuttavia restituisce' int', non 'Nullable '. – Joey

+0

int? non è in realtà un tipo intero ... è una scorciatoia per System.Nullable . – jerhinesmith

0

TryParse restituirà false se la stringa non può essere analizzato. È possibile utilizzare questo fatto per restituire il valore analizzato o null. Comunque immagino che avete intenzione di restituire int? dal tuo metodo, allora sarebbe qualcosa di simile:

public int? ParseInt(string categoryID) 
{ 
    int theIntValue; 
    bool parseOk = int.TryParse(categoryID, out theIntValue); 
    if(parseOk) { 
     return theIntValue; 
    } else { 
     return null; 
    } 
} 
14

Ecco un uso corretto di Int32.TryParse:

int? value; 
int dummy; 
if(Int32.TryParse(categoryID, out dummy)) { 
    value = dummy; 
} 
else { 
    value = null; 
} 
return value; 
+4

Oppure: valore = int.TryParse (categoryID, out dummy)? manichino: null; –

+1

Sì, assolutamente ma è più opaco per un neofita. – jason

+0

@Dan: non compilerà ;-) Ma sì, preferisco quella soluzione (più un cast, per renderlo compilabile). –

0

Vuoi fare qualcosa di simile Questo?

public int? Parse(string categoryID) 
{ 
    int value; 
    if (int.TryParse(categoryID, out value)) 
    { 
    return value; 
    } 
    else 
    { 
    return null; 
    } 
} 
9

Che ne dici di questo?

public int? ParseToNull(string categoryId) 
{ 
    int id; 
    return int.TryParse(categoryId, out id) ? (int?)id : null; 
} 
+0

Questa soluzione potrebbe trarre beneficio dall'essere trasformata in un metodo di estensione. –

+0

È già un metodo di estensione nella mia app, ma non sapevo cosa volesse il molgan per così l'ho tenuto come metodo. – DigitalNomad

+0

non hai bisogno del cast su id lì. Un int o un nullo è un Nullable valido :). – Khanzor

2

più semplice ...

Int N = Int.TryParse(somestring, N) ? N : 0; 

Funziona perche' esso viene valutato da sinistra a destra. Null non così facile.

Problemi correlati