C# Erros do Compilador
Quando o código tem um erro, o compilador do C# não cria o programa e diz o que achou, com um código como CS0103. Esta página junta os erros e avisos que você mais vai ver, cada um com um código pequeno que o provoca, a mensagem real, o que ela quer dizer, como consertar e a aula que ensina o assunto. Todos foram provocados de verdade.
Como usar esta página
- Procure pelo código (Ctrl+F e
CS0103): ele é o mesmo em qualquer língua e em qualquer computador. Ou procure um pedaço da mensagem.
- As mensagens estão como saem na máquina da Ana:
dotnet 10.0.112 (C# 14) num Ubuntu em português, pasta ~/cs/erros, com dotnet run arquivo.cs. Os nomes entre aspas ("idad") mudam conforme o seu código; o resto é igual.
- Em fóruns e no site da Microsoft, a mensagem aparece em inglês. Para os erros mais comuns, a página mostra também o texto em inglês.
- O editor do guia usa o mesmo compilador (Roslyn) e mostra o mesmo código e a mesma mensagem.
Atalhos: Ler uma mensagem · Os 10 mais comuns · Sintaxe · Nomes e escopo · Tipos e conversões · var, const e literais · Métodos e retorno · Decisões e laços · Classes e objetos · Herança e interfaces · Arrays e coleções · null · async · Avisos · Erros de projeto e do dotnet · Experimente
Como ler uma mensagem do compilador
int idade = 29;
Console.WriteLine(idad);
$ dotnet run cs0103.cs
/home/ana/cs/erros/cs0103.cs(2,19): error CS0103: O nome "idad" não existe no contexto atual
/home/ana/cs/erros/cs0103.cs(1,5): warning CS0219: A variável "idade" é atribuída, mas seu valor nunca é usado
Ocorreu uma falha no build. Corrija os erros de build e execute novamente.
| Pedaço | O que quer dizer |
/home/ana/cs/erros/cs0103.cs | o arquivo, com o caminho completo |
(2,19) | (linha, coluna): linha 2, coluna 19. Os editores de código pulam direto para lá. |
error | o tipo: error (erro) impede o programa de ser criado; warning (aviso) deixa criar, mas aponta algo suspeito |
CS0103 | o código do erro: "CS" de C Sharp e um número. É o que você procura |
O nome "idad" não existe no contexto atual | a mensagem |
Ocorreu uma falha no build… | o dotnet avisando que, por causa dos erros, não rodou nada |
Três regras para qualquer erro
- Conserte o primeiro erro primeiro. Um erro de sintaxe costuma provocar outros em cascata, e eles somem junto.
- Olhe a linha apontada e a de cima. Um
; esquecido aparece como erro no fim da linha, mas às vezes o compilador só percebe na seguinte.
- Os avisos importam. O
CS8602 (possível null) é o aviso de uma NullReferenceException que vai acontecer. Aula: Avisos do Compilador.
Os 10 mais comuns
| Código | Em português | Em inglês (para pesquisar) | Causa mais comum |
CS0103 | O nome "idad" não existe no contexto atual | The name 'idad' does not exist in the current context | erro de digitação, ou variável de outro bloco |
CS1002 | ; esperado | ; expected | faltou o ; |
CS0029 | Não é possível converter implicitamente tipo "string" em "int" | Cannot implicitly convert type 'string' to 'int' | texto onde se espera número, ou o contrário |
CS0266 | Não é possível converter implicitamente tipo "double" em "int". Existe uma conversão explícita (há uma conversão ausente?) | Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?) | double num int sem cast |
CS0165 | Uso de variável local não atribuída "total" | Use of unassigned local variable 'total' | variável declarada sem valor |
CS0161 | "Maior(int, int)": nem todos os caminhos de código retornam um valor | 'Maior(int, int)': not all code paths return a value | faltou o return no fim |
CS1061 | ‘string’ não contém uma definição para "Tamanho" e não foi possível encontrar nenhum método de extensão… | 'string' does not contain a definition for 'Tamanho' and no accessible extension method… | método ou propriedade com o nome errado |
CS0246 | O nome do tipo ou do namespace "Lista<>" não pode ser encontrado (está faltando uma diretiva using ou uma referência de assembly?) | The type or namespace name 'Lista<>' could not be found (are you missing a using directive or an assembly reference?) | faltou um using, ou o nome está errado |
CS1503 | Argumento 1: não é possível converter de "string" para "int" | Argument 1: cannot convert from 'string' to 'int' | argumento do tipo errado |
CS8602 | Desreferência de uma referência possivelmente nula. | Dereference of a possibly null reference. | usar . num valor que pode ser null (é um aviso) |
Sintaxe: o código não está bem escrito
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS1002 | Console.WriteLine("Olá") (sem ;) | error CS1002: ; esperado | Toda instrução termina com ;. A coluna apontada é o fim da linha sem ele. | Sintaxe |
CS1003 | int preco = 10 (sem ;) e, na linha de baixo, Console.WriteLine(preco); | error CS1003: Erro de sintaxe, "," esperado | Também é o ; que faltou! Numa declaração, o compilador acha que vem outra variável (int a = 1, b = 2;) e pede uma vírgula. Leia a mensagem e a linha: o conserto é o ;. | Sintaxe |
CS1513 | um { sem o } | error CS1513: } esperada | O arquivo acabou com uma chave aberta. Conte as chaves; a formatação automática do editor mostra qual ficou sem par. | Sintaxe |
CS1026 | Console.WriteLine((2 + 3); | error CS1026: ) esperado | Parêntese aberto e não fechado. | Sintaxe |
CS1010 | Console.WriteLine("Olá, mundo!); | error CS1010: Newline em constante
error CS1026: ) esperado
error CS1002: ; esperado | Faltou fechar as aspas: o texto "vazou" até o fim da linha, e os outros erros vêm daí. | Strings |
CS1012 | char c = 'ab'; | error CS1012: Número excessivo de caracteres no literal de caractere | Aspas simples são para um caractere só. Texto vai em aspas duplas. | char e bool |
CS1011 | char c = ''; | error CS1011: Literal de caractere vazio | Um char não pode ser vazio. Para "nenhum caractere", use uma string vazia (""). | char e bool |
CS1001 | double base = 4; | error CS1001: Identificador esperado
error CS1003: Erro de sintaxe, "," esperado | base é palavra reservada. Troque o nome (ou use @base). Lista em Palavras-chave. | Nomes e Convenções |
CS1525 | if (nota >= 0 && <= 10) | error CS1525: Termo de expressão inválido "<=" | Cada lado do && precisa ser uma comparação completa: nota >= 0 && nota <= 10. | Operadores Lógicos |
CS0201 | x == 5; sozinho na linha | error CS0201: Somente as expressões de atribuição, chamada, incremento, diminuição, espera e novo objeto podem ser utilizadas como uma instrução | Uma comparação sozinha não faz nada. Queria guardar? x = 5;. Queria testar? if (x == 5). | Comparação |
CS0131 | 5 = x; | error CS0131: O lado esquerdo de uma atribuição deve ser uma variável, uma propriedade ou um indexador | À esquerda do = tem de haver uma variável (ou propriedade). Escreva x = 5;. | Atribuição |
CS8803 | uma class antes do Console.WriteLine | error CS8803: As instruções de nível superior precisam preceder as declarações de namespace e de tipo. | Em Program.cs, as instruções vêm primeiro; classes, records e enums vão no fim do arquivo (ou em outro arquivo). | Program.cs e o Main |
CS0116 | public int x = 5; nas instruções de nível superior | error CS0116: Um namespace não pode conter diretamente membros, como campos, métodos ou instruções | public, private e static são para membros de classes, não para variáveis locais. | public, private e internal |
CS8361 | $"{idade >= 18 ? "maior" : "menor"}" | error CS8361: Uma expressão condicional não pode ser usada diretamente em uma interpolação de cadeia de caracteres porque ‘:’ encerra a interpolação. Use parênteses na expressão condicional. (junto com CS8076 e dois CS1003, consequências do mesmo problema) | Dentro de { }, o : começa um formato. Ponha o ternário entre parênteses: {(idade >= 18 ? "maior" : "menor")}. | Interpolação |
CS0650 | int v[] = new int[3]; (como em C) | error CS0650: Declarador de matriz incorreto: para declarar uma matriz gerenciada, o especificador de classificação antecede o identificador de variável. Para declarar um campo de buffer de tamanho fixo, use a palavra-chave fixed antes do tipo de campo. | No C#, os colchetes vão no tipo: int[] v = new int[3]; | Arrays |
CS0270 | int[3] v; | error CS0270: O tamanho de matriz não pode ser especificado em uma declaração de variável (tente inicializar com uma expressão 'new') | O tamanho vai no new, não no tipo: int[] v = new int[3]; | Arrays |
Nomes e escopo
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS0103 | Console.WriteLine(idad); com int idade | error CS0103: O nome "idad" não existe no contexto atual | Nome que não existe: confira a grafia (maiúsculas contam: Idade ≠ idade). | Variáveis |
CS0103 | usar fora do bloco uma variável declarada dentro de um if | error CS0103: O nome "dentro" não existe no contexto atual | A variável só existe dentro das { } em que nasceu. Declare antes do if. | Escopo |
CS0841 | usar a variável antes da linha que a declara | error CS0841: Não é possível usar a variável local "total" antes de declará-la | Declare antes de usar. | Variáveis |
CS0128 | int total = 0; duas vezes | error CS0128: Uma variável de local ou função denominada 'total' já está definida neste escopo | Declare uma vez; depois, só atribua: total = 5; | Variáveis |
CS0136 | int i = 10; e depois for (int i = 0; …) | error CS0136: Um local ou um parâmetro denominado "i" não pode ser declarado neste escopo porque esse nome é usado em um escopo delimitador de local para definir um local ou parâmetro | Um bloco de dentro não pode reaproveitar um nome do bloco de fora. Use outro nome. | Escopo |
CS0246 | Lista<int> numeros = new(); | error CS0246: O nome do tipo ou do namespace "Lista<>" não pode ser encontrado (está faltando uma diretiva using ou uma referência de assembly?) | O tipo não existe com esse nome: é List. | List<T> |
CS0246 | StringBuilder sb = new(); sem using | error CS0246: O nome do tipo ou do namespace "StringBuilder" não pode ser encontrado (está faltando uma diretiva using ou uma referência de assembly?) | O tipo existe, mas num namespace que não foi trazido: ponha using System.Text; no topo. | Namespaces e using |
CS0234 | using System.Textos; | error CS0234: O nome de tipo ou namespace "Textos" não existe no namespace "System" (você está sem uma referência de assembly?) | Esse namespace não existe (é System.Text), ou falta instalar o pacote. | Pacotes NuGet |
CS0117 | Console.Writeline("oi"); | error CS0117: "Console" não contém uma definição para "Writeline" | O nome está quase certo: é WriteLine, com L maiúsculo. | Saída |
CS1061 | nome.Tamanho com string nome | error CS1061: ‘string’ não contém uma definição para "Tamanho" e não foi possível encontrar nenhum método de extensão "Tamanho" que aceite um primeiro argumento do tipo ‘string’ (você está se esquecendo de usar uma diretiva ou uma referência de assembly?) | O tipo não tem esse membro: é nome.Length. A dica do fim (diretiva ou referência de assembly) aparece em todo CS1061 e quase nunca é o problema. | Métodos de String |
CS0119 | int n = Math; | error CS0119: "Math" é um tipo, que não é válido no contexto fornecido | Usou um tipo onde se espera um valor. Faltou o membro: Math.PI, Math.Max(a, b). | Tipos de Dados |
Tipos e conversões
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS0029 | int idade = "29"; | error CS0029: Não é possível converter implicitamente tipo "string" em "int" | Texto não vira número sozinho. Converta: int.Parse("29"), ou int.TryParse com o que o usuário digita. | Parse e TryParse |
CS0029 | if (x) com int x | error CS0029: Não é possível converter implicitamente tipo "int" em "bool" | O if quer um bool. Escreva a comparação: if (x != 0). (Em C, if (x) valia.) | if e else |
CS0029 | string s = 'a'; | error CS0029: Não é possível converter implicitamente tipo "char" em "string" | 'a' é char. Use aspas duplas: "a". | char e bool |
CS0266 | int nota = media; com double media | error CS0266: Não é possível converter implicitamente tipo "double" em "int". Existe uma conversão explícita (há uma conversão ausente?) | A conversão pode perder a parte decimal, então o C# exige que você diga: (int)media (corta) ou (int)Math.Round(media) (arredonda). | Conversão de Tipos |
CS0029 | List<int> l = v; com int[] v | error CS0029: Não é possível converter implicitamente tipo "int[]" em "System.Collections.Generic.List<int>" | Um array não é uma List. Crie uma: List<int> l = [.. v]; ou v.ToList(). | List<T> |
CS0029 | List<int> l = new List<string>(); | error CS0029: Não é possível converter implicitamente tipo "System.Collections.Generic.List<string>" em "System.Collections.Generic.List<int>" | Os tipos de dentro dos < > têm de bater. | Generics |
CS0030 | (int)texto com string texto | error CS0030: Não é possível converter tipo "string" em "int" | O cast não converte texto em número. Use int.Parse(texto). | Parse e TryParse |
CS0019 | a > b com string a e int b | error CS0019: O operador ">" não pode ser aplicado a operandos dos tipos "string" e "int" | O operador não existe para esses tipos. Converta um deles antes. | Comparação |
CS0019 | preco * taxa com decimal e double | error CS0019: O operador "*" não pode ser aplicado a operandos dos tipos "decimal" e "double" | decimal e double não se misturam. Use 0.1m (tudo decimal) ou (decimal)taxa. | float, double e decimal |
CS0023 | !x com int x | error CS0023: O operador "!" não pode ser aplicado ao operando do tipo "int" | O ! é só para bool. Escreva x == 0. | Operadores Lógicos |
CS0037 | int idade = null; | error CS0037: Não é possível converter o valor nulo em 'int' porque ele não é um tipo de valor não anulável | Um int sempre tem valor. Para "sem valor", use int?. | null |
CS0173 | var x = ok ? 1 : "um"; | error CS0173: Tipo de expressão condicional não pode ser determinado porque não há conversão implícita entre "int" e "string" | Os dois lados do ternário precisam ser do mesmo tipo (ou conversíveis). | Operador Ternário |
var, const e literais
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS0165 | int total; e depois Console.WriteLine(total); | error CS0165: Uso de variável local não atribuída "total" | A variável foi declarada, mas nunca recebeu valor. Dê um valor inicial: int total = 0; | Variáveis |
CS0165 | o valor só é dado dentro de um if | error CS0165: Uso de variável local não atribuída "nota" | Se o if for falso, a variável fica sem valor. Dê um valor antes, ou um else. | if e else |
CS0818 | var x; | error CS0818: Variáveis de tipo implícito devem ser inicializadas | O var descobre o tipo pelo valor; sem valor, não há o que descobrir. | var |
CS0815 | var nada = null; | error CS0815: Não é possível atribuir <nulo> a uma variável de tipo implícito | null não tem tipo. Escreva o tipo: string? nada = null; | var |
CS8917 | var f = x => x * 2; | error CS8917: O tipo de representante não pôde ser inferido. | O compilador não sabe o tipo do x. Escreva-o: var f = (int x) => x * 2; ou Func<int, int> f = x => x * 2; | Lambdas |
CS9176 | var vazia = []; | error CS9176: Não há um tipo de destino para a expressão de coleção. | Os colchetes não dizem o tipo da coleção: List<int> vazia = []; | List<T> |
CS0133 | const int dobro = n * 2; com int n | error CS0133: A expressão que está sendo atribuída a "dobro" deve ser constante | Um const precisa ser calculável na compilação. Use uma variável comum (ou readonly num campo). | Constantes |
CS0664 | decimal preco = 15.90; | error CS0664: Literal do tipo double não pode ser convertido implicitamente no tipo "decimal"; use um sufixo "M" para criar um literal desse tipo | 15.90 é double. Escreva 15.90m. (Com float, o sufixo é f.) | float, double e decimal |
CS0020 | 10 / 0 | error CS0020: Divisão por zero constante | O compilador viu a divisão por zero. Com uma variável, o erro só aparece ao rodar (DivideByZeroException). | Operadores Aritméticos |
CS0221 | byte b = (byte)300; | error CS0221: O valor de constante "300" não pode ser convertido em "byte" (use a sintaxe "unchecked" para substituir) | A constante não cabe no tipo. Veja Tipos e Limites. | Conversão de Tipos |
Métodos, parâmetros e retorno
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS0161 | int Maior(…) que só tem return dentro do if | error CS0161: "Maior(int, int)": nem todos os caminhos de código retornam um valor | Se o if for falso, a função chega ao fim sem devolver nada. Ponha um return no fim (ou um else). | Valor de Retorno |
CS0127 | return 5; num método void | error CS0127: Como "Mostrar()" retorna void, uma palavra-chave return não deve ser seguida por uma expressão de objeto | Um void não devolve nada. Tire o valor, ou troque o void pelo tipo. | Valor de Retorno |
CS0126 | return; num método int | error CS0126: Um objeto de tipo conversível em "int" é necessário | O método prometeu um int: devolva um. | Valor de Retorno |
CS1501 | Soma(1, 2, 3) com Soma(int a, int b) | error CS1501: Nenhuma sobrecarga para o método "Soma" leva 3 argumentos | Número errado de argumentos. | Parâmetros |
CS7036 | Soma(1) com Soma(int a, int b) | error CS7036: Não há nenhum argumento fornecido que corresponda ao parâmetro necessário 'b' de 'Soma(int, int)' | Faltou um argumento obrigatório. Passe-o, ou dê um valor padrão ao parâmetro (int b = 0). | Parâmetros Opcionais |
CS1503 | Dobro("4") com Dobro(int n) | error CS1503: Argumento 1: não é possível converter de "string" para "int" | O argumento é de outro tipo. Passe 4, ou converta. | Parâmetros |
CS1620 | Dobrar(n) com Dobrar(ref int x) | error CS1620: Argumento 1 não deve ser transmitido com a palavra-chave "ref" | O parâmetro é ref: a chamada também leva ref: Dobrar(ref n). | ref, out e in |
CS0177 | um método com out int valor que não dá valor a ele | error CS0177: O parâmetro out "valor" deve ser atribuído antes que o controle saia do método atual | Todo parâmetro out tem de receber um valor antes de o método terminar. | ref, out e in |
CS0206 | Dobrar(ref p.Idade) com uma propriedade | error CS0206: Talvez uma propriedade ou um indexador sem retorno de ref não pode ser usado como um valor out ou ref | Propriedades não vão por ref. Copie para uma variável, passe a variável e guarde de volta. | ref, out e in |
CS0111 | dois Somar(int, int) na mesma classe | error CS0111: Tipo "Calc" já define um membro chamado "Somar" com os mesmos tipos de parâmetro | Sobrecarga exige parâmetros de tipos diferentes; só mudar o nome dos parâmetros não basta. | Sobrecarga |
CS0121 | Util.Mostrar(null) com Mostrar(string?) e Mostrar(int[]?) | error CS0121: A chamada é ambígua entre os seguintes métodos ou propriedades: "Util.Mostrar(string?)" e "Util.Mostrar(int[]?)" | As duas versões servem, e o compilador não escolhe. Diga o tipo: Mostrar((string?)null). | Sobrecarga |
CS0428 | string maiusc = nome.ToUpper; | error CS0428: Não é possível converter o grupo de métodos "ToUpper" no tipo "string" não delegado. Você pretendia invocar o método? | Faltaram os parênteses: nome.ToUpper(). Sem eles, é o método em si, não o resultado. | Métodos |
Decisões, laços e exceções
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS0163 | um case sem break antes do próximo | error CS0163: Controle não pode passar através de um rótulo case ("case 1:") para outro | No C#, um case não "cai" no seguinte: termine cada um com break (ou return). | switch |
CS0152 | dois case 1: | error CS0152: A instrução switch contém vários casos com o valor de rótulo "1" | Cada case com um valor diferente. | switch |
CS9135 | case x: com uma variável | error CS9135: Um valor constante do tipo 'int' é esperado | O case quer um valor fixo. Para comparar com variável, use case var v when v == x: ou um if. | switch |
CS8120 | case object: antes de case int: | error CS8120: O caso do comutador não está acessível. Ele já foi manipulado por um caso anterior ou não é possível fazer a correspondência. | O primeiro case já pega tudo; o segundo nunca roda. Ponha o mais específico primeiro. | Pattern Matching |
CS8509 (aviso) | n switch { 1 => "um", 2 => "dois" } | warning CS8509: A expressão switch não manipula todos os valores possíveis do tipo de entrada (ela não é exaustiva). Por exemplo, o padrão '0' não é coberto. | A expressão switch não cobre todos os valores; se nenhum casar, o programa lança exceção. Acrescente _ => "outro". | Expressões switch |
CS0139 | break; dentro de um if, fora de laço | error CS0139: Nenhum loop delimitador a partir do qual quebrar ou continuar | break e continue só existem dentro de laços (e o break, no switch). Para sair de um método, return. | break e continue |
CS0160 | catch (IOException) antes de catch (FileNotFoundException) | error CS0160: Cláusula catch anterior já captura todas as exceções desta ou de um super tipo ("IOException") | O primeiro catch já pega o segundo tipo (é a mãe dele). Ponha o mais específico primeiro. Veja a família das exceções. | try e catch |
Classes, objetos e propriedades
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS0120 | Conta.Saldo (pela classe, e não por um objeto) | error CS0120: Uma referência de objeto é necessária para o campo, o método ou a propriedade "Conta.Saldo" não estática | Saldo pertence a cada conta. Use o objeto: c.Saldo. | Classes e Objetos |
CS0120 | um static void Main usando um campo que não é static | error CS0120: Uma referência de objeto é necessária para o campo, o método ou a propriedade "Programa.contador" não estática | Um método static não tem objeto. Crie um objeto, ou marque o campo como static. | static |
CS0122 | c._saldo = 100; com private decimal _saldo | error CS0122: "Conta._saldo" é inacessível devido ao seu nível de proteção | Membro private só é visto dentro da classe. Use um método público (Depositar). | Encapsulamento |
CS0200 | p.Nome = "Bia"; com Nome { get; } | error CS0200: A propriedade ou o indexador "Pessoa.Nome" não pode ser atribuído, pois é somente leitura | A propriedade é só de leitura. Dê o valor no construtor, ou acrescente set/init. | Propriedades |
CS0272 | t.Feita = true; com { get; private set; } | error CS0272: A propriedade ou o indexador "Tarefa.Feita" não pode ser usado neste contexto porque o acessador set é inacessível | Só a classe muda. Chame o método que ela oferece (t.Concluir()). Cenário no projeto Tarefas. | Encapsulamento |
CS8852 | mudar uma propriedade de um record posicional | error CS8852: A propriedade somente de inicialização ou o indexador 'Produto.Quantidade' só pode ser atribuído em um inicializador de objeto, … | Use with: p = p with { Quantidade = 11 };. Cenário no projeto Estoque. | Records |
CS0102 | dois campos Nome na mesma classe | error CS0102: O tipo "Pessoa" já contém uma definição para "Nome" | Cada membro com um nome. | Campos |
CS0236 | um campo calculado a partir de outro campo | error CS0236: Um inicializador de campo não pode referenciar o campo, o método ou a propriedade não estática "Conta.saldo" | O valor inicial de um campo não pode usar outro campo. Calcule no construtor, ou use uma propriedade (decimal Dobro => saldo * 2;). | Campos |
CS0170 | ler o campo de uma struct que não recebeu valor | error CS0170: Uso de campo possivelmente não atribuído "X" | Crie a struct com new Ponto() ou dê valor aos campos antes. | Structs |
CS1612 | pontos[0].X = 5; numa List de struct | error CS1612: Não é possível modificar o valor de retorno "List<Ponto>.this[int]" porque ele não é uma variável | A lista devolve uma cópia da struct; mudar a cópia não adianta. Copie, mude e guarde: var p = pontos[0]; p.X = 5; pontos[0] = p; | Valor × Referência |
CS0311 | Caixa<Coisa> com where T : IComparable<T> | error CS0311: O tipo "Coisa" não pode ser usado como parâmetro de tipo "T" no tipo ou método genérico "Caixa<T>". Não há conversão de referência implícita de "Coisa" em "System.IComparable<Coisa>". | O tipo não cumpre a restrição do genérico. | Restrições (where) |
Herança e interfaces
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS0535 | class Quadrado : IForma { } sem o Area() | error CS0535: "Quadrado" não implementa membro de interface "IForma.Area()" | Quem assina a interface tem de escrever todos os membros dela. | Interfaces |
CS0534 | class Circulo : Forma { } sem o override do método abstrato | error CS0534: "Circulo" não implementa membro abstrato herdado "Forma.Area()" | Escreva public override double Area() => …. | Classes Abstratas |
CS0144 | new Forma() com abstract class Forma | error CS0144: Não é possível criar uma instância do tipo abstrato ou da interface 'Forma' | Classe abstrata não se instancia: crie uma filha (new Circulo()). | Classes Abstratas |
CS0506 | override de um método que não é virtual | error CS0506: "Gato.Falar()": não é possível substituir o membro herdado "Animal.Falar()" porque ele não está marcado como virtual, abstract ou override | Marque o método da mãe como virtual (ou abstract). | virtual e override |
CS0108 (aviso) | um campo Nome na mãe e outro na filha | warning CS0108: "Gato.Nome" oculta o membro herdado "Animal.Nome". Use a nova palavra-chave se foi pretendido ocultar. | A filha esconde o membro da mãe, quase sempre sem querer. Tire o da filha, ou escreva new se for de propósito. | Herança |
Arrays e coleções
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS0847 | new int[3] { 1, 2 } | error CS0847: Inicializador de matriz de comprimento "3" é esperado | O tamanho e a quantidade de valores não batem. Tire o tamanho: int[] v = [1, 2]; | Arrays |
CS0021 | n[0] com int n | error CS0021: Não é possível aplicar a indexação com [] a uma expressão do tipo "int" | Colchetes só em arrays, listas, strings e coleções. | Arrays |
CS1061 | lista.Length numa List | error CS1061: ‘List<int>’ não contém uma definição para "Length" … | Na List, é Count. Mais casos em Coleções. | List<T> |
null e referências anuláveis (avisos)
Com <Nullable>enable</Nullable> (o padrão dos projetos novos e dos arquivos rodados com dotnet run arquivo.cs), o compilador avisa onde um null pode causar NullReferenceException. São avisos: o programa roda, mas o risco é real. Aula: Referências Anuláveis.
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar |
CS8602 | apelido.Length com string? apelido | warning CS8602: Desreferência de uma referência possivelmente nula. | Pode ser null. Confira (if (apelido is not null)) ou use apelido?.Length. |
CS8600 | string nome = Console.ReadLine(); | warning CS8600: Conversão de literal nula ou possível valor nulo em tipo não anulável. | O ReadLine devolve string?. Use Console.ReadLine() ?? "", ou declare string?. |
CS8600 | string nome = null; | warning CS8600: Conversão de literal nula ou possível valor nulo em tipo não anulável. | Se pode ser null, declare string?. |
CS8625 | Saudar(null) com Saudar(string nome) | warning CS8625: Não é possível converter um literal nulo em um tipo de referência não anulável. | O parâmetro não aceita null. Passe um texto, ou declare string? nome (e trate o null dentro). |
CS8618 | uma propriedade string Nome { get; set; } sem valor inicial | warning CS8618: O propriedade não anulável 'Nome' precisa conter um valor não nulo ao sair do construtor. Considere adicionar o modificador "obrigatório" ou declarar o propriedade como anulável. | A propriedade começa null. Dê um valor (= "";), use required, ou um construtor que a preencha. |
async e await
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar | Aula |
CS4033 | await num método sem async | error CS4033: O operador 'await' só pode ser usado em um método assíncrono. Considere marcar esse método com o modificador 'async' e alterar seu tipo de retorno para 'Task'. | Marque o método como async e devolva Task: static async Task Esperar(). | async e await |
CS0029 | int n = Calcular(); com Task<int> Calcular() | error CS0029: Não é possível converter implicitamente tipo "System.Threading.Tasks.Task<int>" em "int" | Faltou o await: int n = await Calcular(); | Task |
Avisos comuns
Aviso (warning) não impede o programa de rodar, mas quase sempre aponta um defeito. Aula: Avisos do Compilador.
| Código | Exemplo que provoca | Mensagem real | O que significa e como consertar |
CS0168 | int x; e nada mais | warning CS0168: A variável "x" está declarada, mas nunca é usada | Sobra de código: apague a variável. |
CS0219 | int x = 5; e nada mais | warning CS0219: A variável "x" é atribuída, mas seu valor nunca é usado | Idem; às vezes é um erro de digitação no nome em outro lugar. |
CS0162 | uma linha depois do return | warning CS0162: Código inacessível detectado | Essa linha nunca roda. Apague-a, ou mova o return. |
CS0642 | if (x > 3); (com ;) | warning CS0642: Instrução empty possivelmente incorreta | O ; terminou o if ali mesmo, e o bloco de baixo roda sempre. Tire o ;. |
CS0665 | if (pronto = true) | warning CS0665: Atribuição em expressão condicional é sempre constante. Deseja usar == em vez de = ? | = guarda, == compara. Com bool compila, e o if é sempre verdadeiro. Escreva if (pronto). |
CS1717 | x = x; | warning CS1717: Atribuição feita à mesma variável. Você pretendia atribuir outro elemento? | Não faz nada. Em geral era this.x = x; num construtor. |
CS1718 | nan == nan com a mesma variável | warning CS1718: Comparação feita com a mesma variável. Você pretendia comparar com outro elemento? | Comparar algo consigo mesmo é quase sempre engano. |
Erros de projeto e do dotnet
Estes não são do código de um arquivo, mas de como o programa está organizado, ou do próprio comando dotnet. Para provocá-los, a Ana criou um projeto de teste (dotnet new console -o Erros), apagou o Program.cs e foi trocando os arquivos:
$ rm Program.cs
$ echo 'class Ajudante { }' > Ajudante.cs
$ dotnet run
CSC : error CS5001: Programa não contém um método "Main" estático adequado para um ponto de entrada [/home/ana/projetos/Erros/Erros.csproj]
Ocorreu uma falha no build. Corrija os erros de build e execute novamente.
$ rm Ajudante.cs
$ echo 'Console.WriteLine("um");' > Um.cs
$ echo 'Console.WriteLine("dois");' > Dois.cs
$ dotnet run
/home/ana/projetos/Erros/Um.cs(1,1): error CS8802: Apenas uma unidade de compilação pode ter instruções de nível superior. [/home/ana/projetos/Erros/Erros.csproj]
Ocorreu uma falha no build. Corrija os erros de build e execute novamente.
$ cd ~
$ mkdir -p vazia && cd vazia
$ dotnet run
Não foi possível localizar um projeto para executar. Verifique se existe um projeto em /home/ana/vazia ou passe o caminho para o projeto usando --project.
$ dotnet run ola.cs
Não foi possível localizar um projeto para executar. Verifique se existe um projeto em /home/ana/vazia ou passe o caminho para o projeto usando --project.
| Mensagem | O que significa e como consertar | Aula |
CSC : error CS5001: Programa não contém um método "Main" estático adequado para um ponto de entrada | Num projeto, nenhum arquivo tem instruções de nível superior nem um static void Main. Ponha as instruções num Program.cs. | Program.cs e o Main |
error CS8802: Apenas uma unidade de compilação pode ter instruções de nível superior. | Dois .cs do mesmo projeto têm código solto. Deixe as instruções num arquivo só; nos outros, só classes. | Program.cs e o Main |
Não foi possível localizar um projeto para executar. Verifique se existe um projeto em /home/ana/vazia ou passe o caminho para o projeto usando --project. | Aparece em dois casos: dotnet run sem nome de arquivo numa pasta sem .csproj, e dotnet run ola.cs quando o ola.cs não existe nessa pasta (o dotnet não acha o arquivo e procura um projeto). Entre na pasta certa (cd) e confira o nome com ls. | Rodar com dotnet run |
Experimente
Missão: este programa tem três erros. Na primeira vez, o compilador só mostra o de sintaxe (CS1002, na linha 3): enquanto o código não está bem escrito, ele nem chega a conferir o resto. Conserte e rode de novo: aparecem os outros dois (CS0103 e CS0161). Conserte um de cada vez até sair Maior: 9.
int a = 4;
int b = 9;
Console.WriteLine("Comparando...")
Console.WriteLine($"Maior: {Maior(a, B)}");
static int Maior(int x, int y)
{
if (x > y)
{
return x;
}
}
int a = 4;
int b = 9;
Console.WriteLine("Comparando...");
Console.WriteLine($"Maior: {Maior(a, b)}");
static int Maior(int x, int y)
{
if (x > y)
{
return x;
}
return y;
}
Experimente: provoque erros de propósito e veja as mensagens. Apague um ;, troque WriteLine por Writeline, ponha "7" no lugar do 7, tire o m do preço…
int quantidade = 7;
decimal preco = 2.50m;
decimal total = quantidade * preco;
Console.WriteLine($"Total: {total:C}");
Resumo
- Uma mensagem tem arquivo,
(linha,coluna), error ou warning, o código CSxxxx e o texto. Procure pelo código.
- Conserte o primeiro erro primeiro e olhe também a linha de cima.
- Os campeões:
CS0103 (nome não existe), CS1002 (falta ;), CS0029/CS0266 (conversão), CS0165 (sem valor), CS0161 (falta return), CS1061 (membro não existe), CS0246 (tipo não achado ou falta using).
- Avisos de
null (CS8600, CS8602, CS8618) são exceções esperando para acontecer.
- As mensagens do compilador saem em português; as exceções, ao rodar, em inglês (veja Exceções).