Conversiones de tipos en C#
Aprende las conversiones de tipos en C#, incluyendo casting implícito y explícito, Parse, TryParse y métodos Convert con ejemplos.
Durante la programación trabajamos con diferentes tipos de datos. Los datos que provienen del usuario suelen ser de tipo string,
pero para poder realizar operaciones matemáticas, estos datos deben convertirse en tipos numéricos.
En este punto entran en juego las conversiones de tipos.
En este artículo veremos los métodos de conversión de tipos en C#.
Conversión implícita y explícita (Casting)
La conversión de un tipo de dato más pequeño a uno más grande se realiza automáticamente mediante conversión implícita. Sin embargo, al convertir de un tipo más grande a uno más pequeño existe el riesgo de pérdida de datos, por lo que se debe usar conversión explícita.
// Conversión implícita
int numero = 100;
long grande = numero; // conversión automática
double decimalNum = numero; // int → double
// Conversión explícita
double d = 12.9;
int i = (int)d; // 12, se pierde la parte decimal
byte b = (byte)300; // 300 es demasiado grande para byte → desbordamiento
Console.WriteLine(b); // 44
Conversiones con la clase Convert
La clase Convert permite realizar conversiones seguras entre los tipos más utilizados.
string s1 = "42";
int numero = Convert.ToInt32(s1);
string s2 = "3.14";
double pi = Convert.ToDouble(s2);
bool estado = Convert.ToBoolean(1); // true
string texto = Convert.ToString(12345);
Console.WriteLine(numero);
Console.WriteLine(pi);
Console.WriteLine(estado);
Console.WriteLine(texto);
Métodos Parse y TryParse
Parse lanza una excepción en caso de entrada inválida, mientras que TryParse devuelve false si la conversión falla.
Ejemplos con Parse:
int i = int.Parse("123");
double d = double.Parse("12.5");
decimal precio = decimal.Parse("99.99");
bool b = bool.Parse("true");
Console.WriteLine(i);
Console.WriteLine(d);
Console.WriteLine(precio);
Console.WriteLine(b);
Ejemplo con TryParse:
Console.Write("Ingrese un número: ");
string entrada = Console.ReadLine();
if (int.TryParse(entrada, out int resultado))
{
Console.WriteLine("Número ingresado: " + resultado);
}
else
{
Console.WriteLine("Número inválido.");
}
Boxing y Unboxing
Encapsular tipos de valor dentro de un object se denomina boxing,
y extraerlos nuevamente se llama unboxing.
int x = 10;
// Boxing
object obj = x;
// Unboxing
int y = (int)obj;
Console.WriteLine(y);
// Unboxing incorrecto genera un error
object obj2 = "texto";
// int z = (int)obj2; // InvalidCastException
Verificación y operadores de conversión de tipos
Los operadores is, as y las funciones GetType, typeof pueden utilizarse para verificar tipos.
object datos = "Hola";
// operador is
if (datos is string)
Console.WriteLine("Los datos son de tipo string.");
// operador as
string str = datos as string;
if (str != null)
Console.WriteLine(str.ToUpper());
// GetType y typeof
Console.WriteLine(datos.GetType()); // System.String
Console.WriteLine(typeof(int)); // System.Int32
Aplicación de ejemplo
Pidamos la información de un producto al usuario en forma de cadenas y convirtámosla a los tipos adecuados.
Console.Write("Nombre del producto: ");
string producto = Console.ReadLine();
Console.Write("Cantidad: ");
string cantidadStr = Console.ReadLine();
Console.Write("Precio unitario: ");
string precioStr = Console.ReadLine();
Console.Write("Descuento (%): ");
string descuentoStr = Console.ReadLine();
Console.Write("¿En stock? (S/N): ");
string stockStr = Console.ReadLine();
if (int.TryParse(cantidadStr, out int cantidad) &&
decimal.TryParse(precioStr, out decimal precio) &&
double.TryParse(descuentoStr, out double descuento))
{
bool enStock = stockStr.Trim().ToUpper() == "S";
decimal total = cantidad * precio;
decimal montoDescuento = total * (decimal)(descuento / 100);
decimal totalGeneral = total - montoDescuento;
Console.WriteLine($"\nProducto: {producto}");
Console.WriteLine($"Cantidad: {cantidad}");
Console.WriteLine($"Precio unitario: {precio:0.00} EUR");
Console.WriteLine($"Descuento: %{descuento}");
Console.WriteLine($"Stock: {(enStock ? "Disponible" : "No disponible")}");
Console.WriteLine($"Total: {totalGeneral:0.00} EUR");
}
else
{
Console.WriteLine("Entrada inválida.");
}