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çoO que quer dizer
/home/ana/cs/erros/cs0103.cso arquivo, com o caminho completo
(2,19)(linha, coluna): linha 2, coluna 19. Os editores de código pulam direto para lá.
erroro tipo: error (erro) impede o programa de ser criado; warning (aviso) deixa criar, mas aponta algo suspeito
CS0103o código do erro: "CS" de C Sharp e um número. É o que você procura
O nome "idad" não existe no contexto atuala mensagem
Ocorreu uma falha no build…o dotnet avisando que, por causa dos erros, não rodou nada
Três regras para qualquer erro
  1. Conserte o primeiro erro primeiro. Um erro de sintaxe costuma provocar outros em cascata, e eles somem junto.
  2. 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.
  3. 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ódigoEm portuguêsEm inglês (para pesquisar)Causa mais comum
CS0103O nome "idad" não existe no contexto atualThe name 'idad' does not exist in the current contexterro de digitação, ou variável de outro bloco
CS1002; esperado; expectedfaltou o ;
CS0029Nã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
CS0266Nã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
CS0165Uso 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 valuefaltou 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
CS0246O 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
CS1503Argumento 1: não é possível converter de "string" para "int"Argument 1: cannot convert from 'string' to 'int'argumento do tipo errado
CS8602Desreferê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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS1002Console.WriteLine("Olá") (sem ;)error CS1002: ; esperadoToda instrução termina com ;. A coluna apontada é o fim da linha sem ele.Sintaxe
CS1003int preco = 10 (sem ;) e, na linha de baixo, Console.WriteLine(preco);error CS1003: Erro de sintaxe, "," esperadoTambé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
CS1513um { sem o }error CS1513: } esperadaO arquivo acabou com uma chave aberta. Conte as chaves; a formatação automática do editor mostra qual ficou sem par.Sintaxe
CS1026Console.WriteLine((2 + 3);error CS1026: ) esperadoParêntese aberto e não fechado.Sintaxe
CS1010Console.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
CS1012char c = 'ab';error CS1012: Número excessivo de caracteres no literal de caractereAspas simples são para um caractere só. Texto vai em aspas duplas.char e bool
CS1011char c = '';error CS1011: Literal de caractere vazioUm char não pode ser vazio. Para "nenhum caractere", use uma string vazia ("").char e bool
CS1001double 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
CS1525if (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
CS0201x == 5; sozinho na linhaerror CS0201: Somente as expressões de atribuição, chamada, incremento, diminuição, espera e novo objeto podem ser utilizadas como uma instruçãoUma comparação sozinha não faz nada. Queria guardar? x = 5;. Queria testar? if (x == 5).Comparação
CS01315 = 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
CS8803uma class antes do Console.WriteLineerror 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
CS0116public int x = 5; nas instruções de nível superiorerror CS0116: Um namespace não pode conter diretamente membros, como campos, métodos ou instruçõespublic, 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
CS0650int 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
CS0270int[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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS0103Console.WriteLine(idad); com int idadeerror CS0103: O nome "idad" não existe no contexto atualNome que não existe: confira a grafia (maiúsculas contam: Idade ≠ idade).Variáveis
CS0103usar fora do bloco uma variável declarada dentro de um iferror CS0103: O nome "dentro" não existe no contexto atualA variável só existe dentro das { } em que nasceu. Declare antes do if.Escopo
CS0841usar a variável antes da linha que a declaraerror CS0841: Não é possível usar a variável local "total" antes de declará-laDeclare antes de usar.Variáveis
CS0128int total = 0; duas vezeserror CS0128: Uma variável de local ou função denominada 'total' já está definida neste escopoDeclare uma vez; depois, só atribua: total = 5;Variáveis
CS0136int 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âmetroUm bloco de dentro não pode reaproveitar um nome do bloco de fora. Use outro nome.Escopo
CS0246Lista<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>
CS0246StringBuilder sb = new(); sem usingerror 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
CS0234using 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
CS0117Console.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
CS1061nome.Tamanho com string nomeerror 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
CS0119int n = Math;error CS0119: "Math" é um tipo, que não é válido no contexto fornecidoUsou um tipo onde se espera um valor. Faltou o membro: Math.PI, Math.Max(a, b).Tipos de Dados

Tipos e conversões

CódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS0029int 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
CS0029if (x) com int xerror 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
CS0029string s = 'a';error CS0029: Não é possível converter implicitamente tipo "char" em "string"'a' é char. Use aspas duplas: "a".char e bool
CS0266int nota = media; com double mediaerror 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
CS0029List<int> l = v; com int[] verror 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>
CS0029List<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 textoerror 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
CS0019a > b com string a e int berror 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
CS0019preco * taxa com decimal e doubleerror 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 xerror CS0023: O operador "!" não pode ser aplicado ao operando do tipo "int"O ! é só para bool. Escreva x == 0.Operadores Lógicos
CS0037int 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ávelUm int sempre tem valor. Para "sem valor", use int?.null
CS0173var 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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS0165int 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
CS0165o valor só é dado dentro de um iferror 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
CS0818var x;error CS0818: Variáveis de tipo implícito devem ser inicializadasO var descobre o tipo pelo valor; sem valor, não há o que descobrir.var
CS0815var nada = null;error CS0815: Não é possível atribuir <nulo> a uma variável de tipo implícitonull não tem tipo. Escreva o tipo: string? nada = null;var
CS8917var 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
CS9176var 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>
CS0133const int dobro = n * 2; com int nerror CS0133: A expressão que está sendo atribuída a "dobro" deve ser constanteUm const precisa ser calculável na compilação. Use uma variável comum (ou readonly num campo).Constantes
CS0664decimal 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 tipo15.90 é double. Escreva 15.90m. (Com float, o sufixo é f.)float, double e decimal
CS002010 / 0error CS0020: Divisão por zero constanteO compilador viu a divisão por zero. Com uma variável, o erro só aparece ao rodar (DivideByZeroException).Operadores Aritméticos
CS0221byte 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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS0161int Maior(…) que só tem return dentro do iferror CS0161: "Maior(int, int)": nem todos os caminhos de código retornam um valorSe o if for falso, a função chega ao fim sem devolver nada. Ponha um return no fim (ou um else).Valor de Retorno
CS0127return 5; num método voiderror CS0127: Como "Mostrar()" retorna void, uma palavra-chave return não deve ser seguida por uma expressão de objetoUm void não devolve nada. Tire o valor, ou troque o void pelo tipo.Valor de Retorno
CS0126return; num método interror CS0126: Um objeto de tipo conversível em "int" é necessárioO método prometeu um int: devolva um.Valor de Retorno
CS1501Soma(1, 2, 3) com Soma(int a, int b)error CS1501: Nenhuma sobrecarga para o método "Soma" leva 3 argumentosNúmero errado de argumentos.Parâmetros
CS7036Soma(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
CS1503Dobro("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
CS1620Dobrar(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
CS0177um método com out int valor que não dá valor a eleerror CS0177: O parâmetro out "valor" deve ser atribuído antes que o controle saia do método atualTodo parâmetro out tem de receber um valor antes de o método terminar.ref, out e in
CS0206Dobrar(ref p.Idade) com uma propriedadeerror CS0206: Talvez uma propriedade ou um indexador sem retorno de ref não pode ser usado como um valor out ou refPropriedades não vão por ref. Copie para uma variável, passe a variável e guarde de volta.ref, out e in
CS0111dois Somar(int, int) na mesma classeerror CS0111: Tipo "Calc" já define um membro chamado "Somar" com os mesmos tipos de parâmetroSobrecarga exige parâmetros de tipos diferentes; só mudar o nome dos parâmetros não basta.Sobrecarga
CS0121Util.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
CS0428string 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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS0163um case sem break antes do próximoerror CS0163: Controle não pode passar através de um rótulo case ("case 1:") para outroNo C#, um case não "cai" no seguinte: termine cada um com break (ou return).switch
CS0152dois 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
CS9135case x: com uma variávelerror CS9135: Um valor constante do tipo 'int' é esperadoO case quer um valor fixo. Para comparar com variável, use case var v when v == x: ou um if.switch
CS8120case 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
CS0139break; dentro de um if, fora de laçoerror CS0139: Nenhum loop delimitador a partir do qual quebrar ou continuarbreak e continue só existem dentro de laços (e o break, no switch). Para sair de um método, return.break e continue
CS0160catch (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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS0120Conta.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áticaSaldo pertence a cada conta. Use o objeto: c.Saldo.Classes e Objetos
CS0120um static void Main usando um campo que não é staticerror CS0120: Uma referência de objeto é necessária para o campo, o método ou a propriedade "Programa.contador" não estáticaUm método static não tem objeto. Crie um objeto, ou marque o campo como static.static
CS0122c._saldo = 100; com private decimal _saldoerror CS0122: "Conta._saldo" é inacessível devido ao seu nível de proteçãoMembro private só é visto dentro da classe. Use um método público (Depositar).Encapsulamento
CS0200p.Nome = "Bia"; com Nome { get; }error CS0200: A propriedade ou o indexador "Pessoa.Nome" não pode ser atribuído, pois é somente leituraA propriedade é só de leitura. Dê o valor no construtor, ou acrescente set/init.Propriedades
CS0272t.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ívelSó a classe muda. Chame o método que ela oferece (t.Concluir()). Cenário no projeto Tarefas.Encapsulamento
CS8852mudar uma propriedade de um record posicionalerror 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
CS0102dois campos Nome na mesma classeerror CS0102: O tipo "Pessoa" já contém uma definição para "Nome"Cada membro com um nome.Campos
CS0236um campo calculado a partir de outro campoerror 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
CS0170ler o campo de uma struct que não recebeu valorerror CS0170: Uso de campo possivelmente não atribuído "X"Crie a struct com new Ponto() ou dê valor aos campos antes.Structs
CS1612pontos[0].X = 5; numa List de structerror CS1612: Não é possível modificar o valor de retorno "List<Ponto>.this[int]" porque ele não é uma variávelA 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
CS0311Caixa<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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS0535class 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
CS0534class Circulo : Forma { } sem o override do método abstratoerror CS0534: "Circulo" não implementa membro abstrato herdado "Forma.Area()"Escreva public override double Area() => ….Classes Abstratas
CS0144new Forma() com abstract class Formaerror 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
CS0506override de um método que não é virtualerror CS0506: "Gato.Falar()": não é possível substituir o membro herdado "Animal.Falar()" porque ele não está marcado como virtual, abstract ou overrideMarque o método da mãe como virtual (ou abstract).virtual e override
CS0108 (aviso)um campo Nome na mãe e outro na filhawarning 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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS0847new int[3] { 1, 2 }error CS0847: Inicializador de matriz de comprimento "3" é esperadoO tamanho e a quantidade de valores não batem. Tire o tamanho: int[] v = [1, 2];Arrays
CS0021n[0] com int nerror 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
CS1061lista.Length numa Listerror 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ódigoExemplo que provocaMensagem realO que significa e como consertar
CS8602apelido.Length com string? apelidowarning CS8602: Desreferência de uma referência possivelmente nula.Pode ser null. Confira (if (apelido is not null)) ou use apelido?.Length.
CS8600string 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?.
CS8600string 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?.
CS8625Saudar(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).
CS8618uma propriedade string Nome { get; set; } sem valor inicialwarning 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ódigoExemplo que provocaMensagem realO que significa e como consertarAula
CS4033await num método sem asyncerror 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
CS0029int 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ódigoExemplo que provocaMensagem realO que significa e como consertar
CS0168int x; e nada maiswarning CS0168: A variável "x" está declarada, mas nunca é usadaSobra de código: apague a variável.
CS0219int x = 5; e nada maiswarning CS0219: A variável "x" é atribuída, mas seu valor nunca é usadoIdem; às vezes é um erro de digitação no nome em outro lugar.
CS0162uma linha depois do returnwarning CS0162: Código inacessível detectadoEssa linha nunca roda. Apague-a, ou mova o return.
CS0642if (x > 3); (com ;)warning CS0642: Instrução empty possivelmente incorretaO ; terminou o if ali mesmo, e o bloco de baixo roda sempre. Tire o ;.
CS0665if (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).
CS1717x = 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.
CS1718nan == nan com a mesma variávelwarning 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.
MensagemO que significa e como consertarAula
CSC : error CS5001: Programa não contém um método "Main" estático adequado para um ponto de entradaNum 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).