el compilador sabe que una cadena no puede ser nunca un int?
por lo que le dice eso. Eso no significa que int?
no sea útil. Su caso de intento de uso está lejos de ser el caso normal. La normal es "Quiero representar un número entero y la posibilidad de que el valor esté perdido/desconocido". Para eso, int?
funciona extremadamente bien.
¿Por qué querrías esperar el código original para trabajar? ¿Por qué sería útil?
Tenga en cuenta que puede uso as
con tipos anulables, por unboxing:
object o = "hello";
int? i = o as int?;
if (i == null)
{
// o was not a boxed int
}
else
{
// Can use i.Value to recover the original boxed value
}
EDIT: Después de haber visto a tu comentario, no utiliza as
para analizar las cosas. Es posible que desee utilizar int.TryParse
:
string text = "123":
int value;
if (int.TryParse(text, out value))
{
Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
Console.WriteLine("Unable to parse text as an integer");
}
Si está seguro de la cadena está destinado a ser un número entero (es decir, es un error de otro tipo) a continuación, puedes utilizar int.Parse
:
int value = int.Parse(text);
que la voluntad lanzar una excepción si el análisis falla.
Tenga en cuenta también que estos dos métodos le permiten especificar un proveedor de formato (generalmente una información cultural) que le permite expresar cómo se expresan los números en ese formato (por ejemplo, separadores de miles).
EDITAR: En respuesta a su nueva pregunta, el compilador evita esto porque sabe que una cadena no puede posiblemente sea un recuadro int - la conversión nunca tendrá éxito.Cuando solo sabe que el valor original es un objeto, podría tener éxito.
Por ejemplo, supongamos que te dije: "Aquí hay una forma: ¿es un cuadrado?" Esa es una pregunta sensata. Es razonable preguntar: no se puede decir sin mirar la forma.
Si, sin embargo, dije: "Aquí hay un triángulo: ¿es un cuadrado?" Entonces tendrías el derecho razonable de reírte en mi cara, ya que un triángulo no puede ser un cuadrado, la pregunta no tiene sentido.
porque se está intentando asignar un valor de cadena a un entero. el signo de interrogación solo permite que int contenga un valor nulo, no cambia el hecho de que es un int. – kscott
Juan: No usa un molde o "como" para convertir cadenas y otros tipos. No hay una conversión implícita o explícita disponible; debe usar un método de análisis sintáctico. Vea la segunda mitad de mi respuesta para más detalles y un ejemplo. –
No, nunca habría esperado que un operador de conversión intentara realizar el análisis sintáctico. Vaya, parece que leí mal tu pregunta editada, pensé que dijiste que * estabas * intentando encontrar la manera de hacer la conversión.Sin embargo, dejaré la información adicional para futuros lectores. –