C# Versões do C# e do .NET

Todo ano, em novembro, sai uma versão nova do .NET e, junto com ela, uma versão nova do C#. Por isso você vai ver tutoriais de ".NET 6", "C# 10", ".NET 8"… Nesta aula você aprende a diferença entre a versão da linguagem e a da plataforma, o que quer dizer LTS e STS, o que cada versão trouxe e o que acontece quando você usa um recurso novo numa versão antiga.

Você vai aprender
  • A diferença entre a versão do C# e a versão do .NET, e como as duas andam juntas.
  • O que são as versões LTS (suporte longo) e STS (suporte padrão), e até quando cada uma recebe correções.
  • A tabela das versões do .NET e do C#, com as datas oficiais.
  • Como ler o número 10.0.112 do SDK.
  • Como descobrir a versão do C# com #error version.
  • O que acontece quando você usa um recurso novo numa versão antiga: os erros CS9058 e CS9260.

As datas desta aula foram conferidas em outubro de 2026 nas páginas oficiais da Microsoft (o histórico de versões do C# e a política de suporte do .NET). As saídas de terminal são da máquina da Ana, com o SDK 10.0.112.


A ideia: a língua e o dicionário

Pense no português. Existem as regras da língua (a gramática, o acordo ortográfico) e existe o dicionário que você tem na estante, com as palavras e os exemplos. Quando a regra muda, os dicionários novos já vêm com ela; um dicionário de 1990 não sabe nada do acordo ortográfico de 2009.

Versão do C#Versão do .NET
É comoAs regras da línguaO dicionário (e a cozinha inteira, da aula anterior)
DizO que você pode escrever: palavras-chave, formas de escrever, recursos da linguagemO que vem pronto: a biblioteca de classes, o Runtime, as ferramentas
Quem decideO compilador (Roslyn)O SDK e o Runtime instalados
HojeC# 14.NET 10

As duas andam juntas: cada .NET traz o compilador com a versão do C# do mesmo ano, e um projeto usa, por padrão, a versão do C# que combina com o .NET dele. O .NET 10 usa o C# 14; o .NET 8 usava o C# 12. Por isso tanta gente fala "o C# do .NET 8" em vez de "C# 12".


LTS e STS: quanto tempo cada versão é cuidada

Depois que uma versão sai, a Microsoft continua mandando correções: consertos de falhas de segurança e de erros, uma vez por mês (na segunda terça-feira, o Patch Tuesday). Mas não para sempre. Cada versão tem uma data de fim de suporte, e depois dela não recebe mais nada. Há dois tipos:

TipoQuer dizerSuporteQuais
LTSLong Term Support, "suporte de longo prazo"3 anosAs versões de número par: .NET 6, 8, 10… (saem nos anos ímpares: 2021, 2023, 2025)
STSStandard Term Support, "suporte padrão"2 anos (a partir do .NET 9; o .NET 5 e o .NET 7 tiveram só 18 meses)As versões de número ímpar: .NET 5, 7, 9, 11… (saem nos anos pares)

As duas são igualmente estáveis e testadas; só o tempo de cuidado muda. Empresas costumam ficar nas LTS, para não precisar atualizar todo ano. Quem gosta de usar as novidades primeiro vai de STS. Este guia usa o .NET 10, que é LTS.

A tabela do .NET

VersãoLançamentoTipoFim do suporteC# padrão
.NET Core 2.130/05/2018LTS21/08/20217.3
.NET Core 3.023/09/2019STS03/03/20208.0
.NET Core 3.103/12/2019LTS13/12/20228.0
.NET 510/11/2020STS10/05/20229.0
.NET 608/11/2021LTS12/11/202410
.NET 708/11/2022STS14/05/202411
.NET 814/11/2023LTS10/11/202612
.NET 912/11/2024STS10/11/202613
.NET 1011/11/2025LTS14/11/202814
.NET 11previsto para 10/11/2026STS(2 anos depois)15

Três coisas para reparar:

  • O .NET 8 (LTS de 3 anos) e o .NET 9 (STS de 2 anos) terminam no mesmo dia, 10 de novembro de 2026: daqui a menos de um mês, no momento em que esta aula foi escrita. Quem ainda usa um deles precisa passar para o .NET 10.
  • O .NET 11 ainda não saiu: em outubro de 2026 ele está na versão de testes 11.0.0-rc.2 (release candidate, "candidata a lançamento"). Quando sair, o .NET 10 continua sendo a LTS mais nova, com suporte por mais tempo que o 11.
  • Todas as versões até o .NET 7 já estão fora de suporte: elas funcionam, mas não recebem mais correções de segurança. Um tutorial com .NET Core 3.1 ou .NET 6 ainda ensina muita coisa certa, mas não use essas versões em programas novos.

O que cada versão do C# trouxe

O C# começou pequeno e ganhou recursos a cada versão. Você não precisa decorar esta tabela: ela serve para você saber, ao ver um código antigo, por que ele está escrito daquele jeito. Os links levam às aulas de cada recurso.

VersãoAnoPrincipais novidades
C# 1.02002A base: classes, structs, interfaces, delegates, eventos.
C# 2.02005Generics (List<int>), tipos anuláveis (int?), iteradores (yield return), classes parciais.
C# 3.02007LINQ, lambdas (x => x * 2), var, métodos de extensão, inicializadores de objetos.
C# 4.02010parâmetros opcionais e nomeados, dynamic.
C# 5.02012async e await.
C# 6.02015interpolação ($"Olá, {nome}"), operador ?., nameof.
C# 7.0 a 7.32017–2018tuplas, os primeiros padrões, out var, funções locais, in. O 7.3 é o último do .NET Framework.
C# 8.02019referências anuláveis (string?), expressões switch, índices e intervalos (^1, 1..3), ??=.
C# 92020instruções de nível superior (o programa sem Main), records, init, padrões com and, or e not.
C# 102021global using e os using automáticos, namespace de arquivo, record struct.
C# 112022strings literais brutas ("""…"""), required, padrões de lista.
C# 122023expressões de coleção ([8, 9, 10]), construtores primários.
C# 132024params com qualquer coleção, o novo tipo Lock (aula lock), o escape \e.
C# 142025a palavra-chave field nas propriedades, membros de extensão (extension), atribuição com ?. (cliente?.Nome = "Ana"), construtores e eventos partial.

Repare na linha do C# 9: foi ele que permitiu o programa de uma linha só, Console.WriteLine("Olá, mundo!");. Antes dele, todo programa precisava de class Program e static void Main, e por isso os tutoriais antigos começam assim. A aula Program.cs e o Main mostra as duas formas lado a lado.

Um recurso novo na prática: as expressões de coleção

Até o C# 11, para criar uma lista fixa de números (um array), escrevia-se o tipo duas vezes. O C# 12 trouxe uma forma mais curta, com colchetes:

int[] notas = new int[] { 8, 9, 10 };   // até o C# 11
int[] notas = [8, 9, 10];               // C# 12 em diante

As duas criam exatamente o mesmo array. É assim que o guia marca um recurso novo: com o selo C# 12, que quer dizer "funciona do C# 12 em diante". Se você estiver num projeto antigo (por exemplo, .NET 6 ou 8), olhe o selo antes de copiar o exemplo.

Missão: reescreva a primeira linha com a forma nova do C# 12, com colchetes, e acrescente a nota 7 no fim. A saída deve ser A Ana tem 4 notas.

int[] notas = new int[] { 8, 9, 10 };
Console.WriteLine($"A Ana tem {notas.Length} notas");
int[] notas = [8, 9, 10, 7];
Console.WriteLine($"A Ana tem {notas.Length} notas");
$ dotnet run notas.cs                           « a forma antiga
A Ana tem 3 notas
$ dotnet run notas12.cs                         « a forma nova, com a nota 7
A Ana tem 4 notas

Qual versão do C# eu tenho?

O compilador tem uma pergunta escondida: a linha #error version. O #error manda o compilador parar com um erro (é usado para avisar "não compile isto assim"), e a palavra version faz ele contar, nesse erro, a versão dele e a da linguagem:

Console.WriteLine("Olá!");
#error version
$ dotnet run versao.cs
/home/ana/cs/versao.cs(2,8): error CS1029: #error: "version"
/home/ana/cs/versao.cs(2,8): error CS8304: Compiler version: '5.0.0-2.26422.108 (95017c71)'. Language version: 14.0.

Ocorreu uma falha no build. Corrija os erros de build e execute novamente.
CS1029
O erro que o próprio #error pediu, com o texto que veio depois dele ("version").
CS8304
A resposta, em inglês (esta mensagem não tem tradução): Compiler version é a versão do Roslyn, o compilador (5.0.0), e Language version: 14.0 é a versão do C# que ele está usando.

Como é um erro, o programa não roda (nem o Olá! aparece). Use o truque e depois apague a linha.

Experimente: rode e procure o Language version na mensagem: o editor do guia usa o mesmo compilador do dotnet 10, com o C# 14. Depois apague a linha do #error e rode de novo: agora o Olá! aparece.

Console.WriteLine("Olá!");
#error version

A versão do SDK e a do .NET

Já o comando dotnet --version mostra a versão do SDK, que tem um número de três partes:

$ dotnet --version
10.0.112
ParteValorQuer dizer
Principal10O .NET 10
Secundária0Sempre 0 no .NET atual
Faixa de recursos1xxA "geração" do SDK. A Microsoft lança uma faixa nova (1xx, 2xx, 3xx, 4xx) mais ou menos a cada três meses, com melhorias nas ferramentas. O C# e o Runtime continuam os mesmos.
Correçãoxx12A 12.ª correção dessa faixa

O Runtime tem o número mais simples: 10.0.12 (a 12.ª correção do .NET 10). Para comparar: em outubro de 2026, o site da Microsoft oferecia o SDK 10.0.402 e o Runtime 10.0.13; o Ubuntu 26.04 tinha o SDK 10.0.112 e o Runtime 10.0.12. Os dois são o .NET 10 com o C# 14: o Ubuntu fica na faixa 1xx e recebe as correções um pouco depois.


Usando uma versão mais antiga do C#

Às vezes você precisa saber se um código funciona numa versão antiga (por exemplo, porque a empresa ainda usa o .NET 8). Num projeto, a versão do C# fica no arquivo .csproj, com a propriedade LangVersion (aula O Arquivo .csproj). Num arquivo solto do dotnet run, o .NET 10 aceita a mesma propriedade numa linha especial no topo, que começa com #: (aula Rodar com dotnet run):

#:property LangVersion=11
int[] notas = [8, 9, 10, 7];
Console.WriteLine($"A Ana tem {notas.Length} notas");
$ dotnet run notas11.cs
/home/ana/cs/notas11.cs(2,15): error CS9058: O recurso 'expressões de coleção' não está disponível no C# 11.0. Use a versão do idioma 12.0 ou superior.

Ocorreu uma falha no build. Corrija os erros de build e execute novamente.

O compilador é o mesmo, mas foi mandado "fingir" que é o C# 11, e o C# 11 não conhece os colchetes. A mensagem diz exatamente o que fazer: usar o C# 12 ou mais novo. É essa a mensagem que aparece quando alguém copia um exemplo moderno para um projeto antigo.

Valor de LangVersionQuer dizer
(não escrever nada)A versão padrão do .NET do projeto: no .NET 10, C# 14. É o recomendado.
12, 13, 14…Uma versão exata, mais antiga, para conferir compatibilidade
previewOs recursos em teste da próxima versão
latestA mais nova que o compilador instalado conhece. A Microsoft recomenda não usar: o resultado muda de computador para computador.

Qual versão usar?

SituaçãoUse
Aprender C# (você, agora).NET 10 com o C# 14, como o guia
Programa novo numa empresaA LTS mais nova: hoje, o .NET 10
Quer as novidades assim que saemA STS mais nova (a partir de novembro de 2026, o .NET 11), sabendo que vai precisar atualizar em 2 anos
Manter um programa antigoA versão que ele usa, planejando subir para uma LTS com suporte
Programa antigo do Windows em .NET FrameworkO .NET Framework 4.8.1 (C# 7.3), ou migrar para o .NET 10

Quando dá errado

Recurso novo numa versão antiga: error CS9260
#:property LangVersion=13
var p = new Produto { Nome = "  café " };
Console.WriteLine($"[{p.Nome}]");
class Produto
{
    public string Nome { get; set => field = value.Trim(); } = "";
}
$ dotnet run field.cs
/home/ana/cs/field.cs(6,19): error CS9260: O recurso "campo palavra-chave" não está disponível no C# 13.0. Use a versão da linguagem 14.0 ou superior.

Ocorreu uma falha no build. Corrija os erros de build e execute novamente.

O que significa: a palavra-chave field dentro de uma propriedade é novidade do C# 14 (a tradução automática da mensagem saiu esquisita: "campo palavra-chave" é a field keyword, "a palavra-chave field"). Você vai ver esse erro com um SDK do .NET 9 ou num projeto que fixou o C# 13. Sem a primeira linha, no .NET 10, o mesmo arquivo roda e mostra [café].

Como consertar: use o .NET 10 (ou mais novo), ou escreva a propriedade do jeito antigo, com um campo separado (aula Propriedades). Erros com a frase "não está disponível no C# X" sempre querem dizer isto: recurso novo em versão velha.

Tutorial antigo: 'net8.0' não é um valor válido para '-f'
$ dotnet new console -o Antigo -f net8.0
Erro: Opções inválidas:
-f net8.0
   'net8.0' não é um valor válido para '-f'. Os valores possíveis são:
      net10.0   - Net10.0 de destino

Para obter mais informações, execute:
   dotnet new console -h

Para obter detalhes sobre o código de saída, consulte https://aka.ms/templating-exit-codes#127
$ echo $?
127

O que significa: o tutorial mandou criar um projeto para o .NET 8 (-f de framework), mas o SDK da Ana só sabe criar projetos para o net10.0. O SDK do Ubuntu 26.04 só traz o .NET 10.

Como consertar: tire o -f net8.0 e use o .NET 10; o código do tutorial quase sempre funciona igual. Se você realmente precisa do .NET 8, instale o SDK dele (no Ubuntu, pelo repositório extra da aula Instalar no Linux), lembrando que ele sai de suporte em 10/11/2026.

"Instalei o C# 14 e não achei"

O que acontece: não existe um instalador "do C#". A versão do C# vem dentro do compilador, que vem dentro do SDK do .NET. Quem procura "baixar C# 14" acaba em sites estranhos.

Como consertar: instale o .NET SDK 10 e pronto: o C# 14 vem junto. Confira com #error version.


Referência

.NETC#TipoSuporte até
.NET 610LTSencerrado (12/11/2024)
.NET 711STSencerrado (14/05/2024)
.NET 812LTS10/11/2026
.NET 913STS10/11/2026
.NET 1014LTS14/11/2028
.NET Framework 4.x7.3(vem com o Windows)enquanto o Windows o trouxer
Comando ou códigoPara quê
dotnet --versionVersão do SDK em uso
dotnet --list-sdks e --list-runtimesSDKs e Runtimes instalados
#error versionVersão do compilador e do C# (erro CS8304)
#:property LangVersion=12Fixar a versão do C# num arquivo do dotnet run .NET 10
<LangVersion>12</LangVersion>O mesmo, num projeto (.csproj)

Exercícios

1. A sigla do suporte longo

Qual é a sigla das versões do .NET com 3 anos de suporte?

2. O C# do .NET 10

Que versão do C# o .NET 10 usa por padrão? (Só o número.)

C#

3. A pergunta escondida

Complete a linha que faz o compilador contar a versão do C#:

#error

4. O .NET 9 é STS. Isso quer dizer que…

5. Apareceu O recurso 'expressões de coleção' não está disponível no C# 11.0. O que aconteceu?

6. No 10.0.112 do SDK, o que quer dizer o 1 logo depois do 10.0.?

7. Qual versão do C# permitiu o programa de uma linha só, sem static void Main?

Missão final: a linha do tempo das LTS

Missão: o programa mostra as LTS do .NET, mas está com um erro: o .NET 7 não é LTS. Troque a linha do .NET 7 pela do .NET 8: LTS de 2023 e acrescente, no fim, a do .NET 10: LTS de 2025. A saída deve ter só as três LTS, uma por linha.

Console.WriteLine(".NET 6: LTS de 2021");
Console.WriteLine(".NET 7: LTS de 2022");
Console.WriteLine(".NET 6: LTS de 2021");
Console.WriteLine(".NET 8: LTS de 2023");
Console.WriteLine(".NET 10: LTS de 2025");

Resumo

  • A versão do C# diz o que você pode escrever; a do .NET diz o que vem pronto. Cada .NET usa uma versão do C# por padrão: .NET 10 → C# 14, .NET 8 → C# 12.
  • Sai um .NET por ano, em novembro. As LTS (números pares) têm 3 anos de suporte; as STS (números ímpares), 2 anos.
  • O .NET 8 e o .NET 9 saem de suporte em 10/11/2026. O .NET 10, LTS de novembro de 2025, tem suporte até 14/11/2028.
  • dotnet --version mostra o SDK (10.0.112: .NET 10, faixa 1xx, correção 12); #error version mostra o C# (Language version: 14.0).
  • Recurso novo em versão velha dá erro com a frase "não está disponível no C# X" (CS9058, CS9260). O selo C# 12 do guia avisa a versão mínima.
  • Próximo passo: instalar o .NET 10, em Instalar no Linux ou Instalar no Windows e macOS.