2009-11-13 8 views
12

Gibt es einen Weg Null zurückzugeben, wenn es eine Zeichenkette nicht zu int analysieren kann?int.TryParse = null, wenn nicht numerisch?

mit:

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

„getting kann nicht von 'out string' zu 'out int' konvertieren

was zu tun ist

EDIT:

nicht mehr relevant, weil der asp.net Einschränkungen ist der Weg, um das Problem zu lösen

/M

+2

Warum parsen Sie es zu einem int, wenn Sie es in einer Zeichenfolge speichern möchten ?? –

+2

String ist übrigens ein Referenztyp, also sollten Sie ihn nicht nullfähig machen. (kompiliert dies überhaupt?) –

+0

Ich benutze dies für asp.net mvc, so dass die Kategorie-ID von der URL zugeordnet ist, so bekomme ich Fehler, wenn ich in der Zeichenfolge in URL übergeben –

Antwort

24

Zuerst, warum versuchen Sie, eine Zeichenfolge zu einem int zu analysieren und das Ergebnis in eine Zeichenfolge zurück zu stecken?

Die Methodensignatur ist

bool int.TryParse(string, out int) 

so müssen Sie int als zweites Argument eine Variable vom Typ geben. Dies bedeutet auch, dass Sie null nicht erhalten, wenn das Parsen fehlschlägt, stattdessen gibt die Methode einfach false zurück. Aber Sie können das zusammen leicht zusammensetzen:

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

Eep, danke, Garry. Das Schreiben von Code, ohne ihn jemals zu kompilieren, führt zu Fehlern wie diesen :-) – Joey

+1

Ich wette, das würde eine schöne Erweiterungsmethode ergeben. – cost

0

** Diese Antwort wurde viel abgelehnt ** Obwohl es eine mögliche Lösung ist - es ist eine schlechte Leistung weise, und wahrscheinlich nicht eine gute Programmierung Wahl.

ich es nicht löscht, da ich viele Programmierer denke nicht bewusst sein, könnte dies von hier so ist ein Beispiel dafür, wie die Dinge nicht zu tun:

Verwendung versuchen und

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

Besser, 'Tryparse' zu ​​verwenden. – jason

+0

Nun, das ist immer noch eine Option .... – Dani

+1

Seit C# 2.0 herauskam, ist TryParse fast immer besser als Exception-Fangen. – Bomlin

0

Int zu fangen ist ein Werttyp, der bedeutet, dass es kein null int gibt. Also nein, TryParse wird den out-Parameter niemals ändern, so dass er null ist.

Aber das Problem, das Sie haben, ist, dass Sie eine Zeichenfolge an den out-Parameter von TryParse übergeben, wenn es eine ganze Zahl erwartet.

Sie müssen so etwas wie dieses ...

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

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

Es gibt eine Nullable int: int? – Dani

+0

Dani: 'TryParse' gibt jedoch' int', nicht 'Nullable ' zurück. – Joey

+0

int? ist eigentlich kein Integertyp ... es ist eine Abkürzung für System.Nullable . – jerhinesmith

0

TryParse wird false zurück, wenn die Zeichenfolge nicht analysiert werden können. Sie können diese Tatsache verwenden, um entweder den analysierten Wert oder null zurückzugeben. Wie auch immer ich denke, dass Sie int? von Ihrer Methode zurückzukehren beabsichtigen, dann wäre es so etwas wie dieses:

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

Hier ist eine ordnungsgemäße Verwendung der Int32.TryParse:

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

Oder: Wert = Int.TryParse (Kategorie-ID, aus Dummy)? dummy: null; –

+1

Ja, absolut, aber das ist undurchsichtig für einen Neophyten. – jason

+0

@Dan: wird nicht kompiliert werden ;-) Aber ja, ich bevorzuge diese Lösung (plus einen Cast, um es kompilieren zu lassen). –

0

Haben Sie etwas tun wollen wie Dies?

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

Wie wäre es damit?

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

Diese Lösung könnte davon profitieren, zu einer Erweiterungsmethode gemacht zu werden. –

+0

Es ist bereits eine Erweiterungsmethode in meiner App, aber ich wusste nicht, wofür Molgan es wollte, also behielt ich es als eine Methode. – DigitalNomad

+0

Sie brauchen nicht die Besetzung ID dort. Ein int oder ein null ist eine gültige Nullable :). – Khanzor

2

Simplest ...

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

Es funktioniert, weil es links nach rechts ausgewertet wird. Null nicht so einfach.

Verwandte Themen