Error del compilador · error CS0029

No se puede convertir implícitamente 'X' a 'Y'

Pusiste un valor de un tipo en un hueco que espera otro — y C# no puede (o no quiere) convertirlo en silencio. Pulsa Ejecutar en el código roto: el error de abajo lo producen las mismas reglas que el compilador real.

Míralo ocurrir

int count = "5";   // un string es texto, no una cantidad

El compilador se niega a adivinar. "5" (con comillas) es un string — dos caracteres, un '5' y nada que ver con cantidad. C# podría intentar parsearlo, pero una suposición fallida sería un fallo en tiempo de ejecución en vez de este mensaje, así que te detiene en la compilación.

Las cuatro causas habituales (y sus soluciones)

1. string → int: querías parsear

string input = "5";
int count = int.Parse(input);   // conversión deliberada, puede lanzar FormatException
Console.WriteLine(count + 1);

int.Parse convierte, y dice la verdad cuando no puede. Si el fallo es normal (¡entrada del usuario!), usa int.TryParse(input, out int count), que devuelve false en lugar de lanzar.

2. número → string: querías concatenar

int manzanas = 3;
string msg = "Tienes " + manzanas + " manzanas";   // + convierte con ToString()
Console.WriteLine(msg);

3. bool y su forma textual

bool ok = "true"; falla por la misma razón. Parséalo explícitamente:

bool ok = bool.Parse("true");
Console.WriteLine(ok);

4. objeto de la clase equivocada

Asignar un Dog a una variable Car es el mismo error en forma de clase — no existe conversión alguna:

class Dog { public string Name; }
class Car { public string Model; }

Dog d = new Dog { Name = "Rex" };
Car c = d;   // CS0029: no se puede convertir 'Dog' a 'Car'

El hermano: CS0266 ("falta un cast")

Si los tipos sí son convertibles pero solo de forma explícita — el caso clásico es double → int, que pierde la fracción — obtienes CS0266, con la pista "existe una conversión explícita (¿falta un cast?)":

double precio = 9.99;
int redondeado = precio;        // CS0266: perdería el .99 en silencio
double precio = 9.99;
int redondeado = (int)precio;   // cast explícito: "lo sé, trúncalo"
Console.WriteLine(redondeado);

Regla de oro: CS0029 = no existe conversión implícita (parsea, concatena o replantea el tipo); CS0266 = la conversión existe pero debes escribirla, aceptando la pérdida.

Preguntas frecuentes

¿Qué significa el error CS0029 en C#?

Que asignaste un valor de un tipo a una variable de otro tipo sin conversión implícita — por ejemplo int count = "5";. Solución: int.Parse(s) para strings, .ToString() o $"…" para el sentido inverso, y (int) para double→int (eso es CS0266).

¿Diferencia entre CS0029 y CS0266?

CS0029: no existe conversión implícita (string a int). CS0266: la conversión existe pero perdería datos (double a int), y el compilador exige el cast explícito.

Lista de comprobación