2009-11-13 12 views
12

¿hay alguna manera de devolver nulo si no puede analizar una cadena a int?int.TryParse = null si no es numérico?

con:

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

consiguiendo "no se puede convertir de 'cadena out' a 'cabo int'

qué hacer

EDIT:?

Ya no es importante debido Restricciones de asp.net es la forma de resolver el problema

/M

+2

¿Por qué lo analizas en un int cuando quieres guardarlo en una cadena? –

+2

Por cierto, la cadena es un tipo de referencia, por lo que no debe ser anulable. (¿esto compila de todos modos?) –

+0

Utilizo esto para asp.net mvc así que la categoryID se mapea desde la url, así que obtengo un error si paso una cadena en la url –

Respuesta

24

En primer lugar, ¿por qué estás tratando de analizar una cadena a un entero y se adhieren el resultado de nuevo en una cadena?

La firma del método es

bool int.TryParse(string, out int) 

Así que hay que dar a una variable de tipo int como segundo argumento. Esto también significa que no obtendrá null si el análisis falla, en su lugar el método simplemente devolverá false. Pero puede unir eso fácilmente:

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

Eep, gracias, Garry. Escribir código sin compilarlo invita a errores como los siguientes :-) – Joey

+1

Apuesto a que esto sería un buen método de extensión – cost

0

** esta respuesta fue rechazada mucho ** Aunque es una solución posible, es una mala en cuanto a rendimiento, y probablemente no es una buena opción de programación.

No voy a eliminarlo, ya que supongo que muchos programadores podrían no ser conscientes de ello, por lo que aquí es un ejemplo de cómo no hacer las cosas:

uso intentar coger

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

Es mejor usar 'TryParse'. – jason

+0

Bueno, esto sigue siendo una opción .... – Dani

+1

Desde que salió C# 2.0, TryParse casi siempre es mejor que la captura de excepciones. – Bomlin

0

Int es un tipo de valor que significa que no existe nada nulo int. Entonces, no, TryParse nunca alterará el parámetro de salida para que sea nulo.

Pero el problema es que está pasando una cadena al parámetro out de TryParse cuando espera un número entero.

Es necesario algo como esto ...

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

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

Hay una int nullable? Int? – Dani

+0

Dani: 'TryParse' sin embargo, devuelve' int', no 'Nullable '. – Joey

+0

int? no es en realidad un tipo entero ... es una abreviatura de System.Nullable . – jerhinesmith

0

TryParse devolverá FALSE si la cadena no se puede analizar. Puede usar este hecho para devolver el valor analizado o nulo. De todos modos, supongo que tiene la intención de volver int? de su método, entonces sería algo como esto:

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

He aquí un uso adecuado de Int32.TryParse:

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

O: value = int.TryParse (categoryID, out dummy)? maniquí: nulo; –

+1

Sí, absolutamente, pero eso es más opaco para un neófito. – jason

+0

@Dan: no compilará ;-) Pero sí, prefiero esa solución (más un molde, para hacerlo compilar). –

0

¿Quieres hacer algo como ¿esta?

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

¿Qué le parece esto?

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

Esta solución podría beneficiarse de ser convertida en un método de extensión. –

+0

Ya es un método de extensión en mi aplicación, pero no sabía para qué lo quería Molgan, así que lo guardé como método. – DigitalNomad

+0

no necesita el molde en la identificación allí. Un int o un nulo es un válido Nullable :). – Khanzor

2

más simple ...

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

Funciona porque se evalúa de izquierda a derecha. Null no es tan fácil.

Cuestiones relacionadas