Error del compilador · error CS0117
'X' no contiene una definición para 'Y'
La clase está bien — el nombre del miembro no. Es el gemelo "a nivel de tipo" de CS1061: accediste a través del nombre de la clase en lugar de un objeto.
Míralo ocurrir
Console.WritLine("hola"); // a 'WritLine' le falta la e — WriteLine
El mensaje nombra la clase que buscó (Console), así que sabes que el tipo se resolvió. Solo queda la ortografía después del punto.
Las erratas que todos cometemos
| Escribiste | C# quiere | Nota |
|---|---|---|
Console.WritLine | Console.WriteLine | falta la e |
Console.writeline | Console.WriteLine | PascalCase |
Math.Sqr | Math.Sqrt | falta la t |
Math.Pi | Math.PI | todo en mayúsculas |
Causa 1: una errata (casi siempre)
Console.WriteLine(Math.Sqr(16));
Console.WriteLine(Math.Sqrt(16)); // nombre correcto
Causa 2: el miembro existe pero no es estático
Si el miembro es de instancia, no puedes alcanzarlo por el nombre de la clase — necesitas un objeto:
class Counter
{
public int Value = 0; // campo de instancia
public static int Total = 0; // campo estático
}
Counter.Total = 5; // ✓ estático: por la clase
// Counter.Value = 5; // ✗ no existe un Value estático
var c = new Counter();
c.Value = 5; // ✓ instancia: por el objeto
Causa 3: clase equivocada
A veces el método es real, pero vive en otro tipo. Length pertenece a strings y arrays; Count a las listas. Console.Length no existe en ninguna parte:
int.Prase("5"); // int tiene Parse — no Prase
string.Jion(",", new string[0]); // string tiene Join — no Jion
Console.WriteLine(int.Parse("5")); // nombre correcto
string[] parts = { "a", "b" };
Console.WriteLine(string.Join("-", parts)); // y Join funciona
CS0117 y CS1061, una línea cada uno
| Código | Escribiste | Significado |
|---|---|---|
CS0117 | Type.Member | No existe ese miembro en ese tipo |
| CS1061 | obj.Member | No existe ese miembro en el tipo de ese objeto |
Misma solución — revisa la ortografía y luego si estás en el tipo correcto.
Preguntas frecuentes
¿Qué significa CS0117?
El tipo existe pero no tiene ese miembro — normalmente una errata en un miembro estático como Console.WritLine o Math.Sqr.
¿Diferencia con CS1061?
CS0117 va por el nombre del tipo (Type.Member); CS1061 por una instancia (obj.Member). Misma causa, misma solución.
Lista de comprobación
- Lee el nombre de la clase en el mensaje — confirma que es el tipo que querías.
- Reescribe el miembro despacio; PascalCase, cada letra.
- ¿Es un miembro de instancia? Necesitas un objeto, no el nombre de la clase.
- Usa IntelliSense: escribe el punto y deja que el editor demuestre qué existe.