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.
- 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.112do 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
CS9058eCS9260.
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 | |
|---|---|---|
| É como | As regras da língua | O dicionário (e a cozinha inteira, da aula anterior) |
| Diz | O que você pode escrever: palavras-chave, formas de escrever, recursos da linguagem | O que vem pronto: a biblioteca de classes, o Runtime, as ferramentas |
| Quem decide | O compilador (Roslyn) | O SDK e o Runtime instalados |
| Hoje | C# 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:
| Tipo | Quer dizer | Suporte | Quais |
|---|---|---|---|
| LTS | Long Term Support, "suporte de longo prazo" | 3 anos | As versões de número par: .NET 6, 8, 10… (saem nos anos ímpares: 2021, 2023, 2025) |
| STS | Standard 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ão | Lançamento | Tipo | Fim do suporte | C# padrão |
|---|---|---|---|---|
| .NET Core 2.1 | 30/05/2018 | LTS | 21/08/2021 | 7.3 |
| .NET Core 3.0 | 23/09/2019 | STS | 03/03/2020 | 8.0 |
| .NET Core 3.1 | 03/12/2019 | LTS | 13/12/2022 | 8.0 |
| .NET 5 | 10/11/2020 | STS | 10/05/2022 | 9.0 |
| .NET 6 | 08/11/2021 | LTS | 12/11/2024 | 10 |
| .NET 7 | 08/11/2022 | STS | 14/05/2024 | 11 |
| .NET 8 | 14/11/2023 | LTS | 10/11/2026 | 12 |
| .NET 9 | 12/11/2024 | STS | 10/11/2026 | 13 |
| .NET 10 | 11/11/2025 | LTS | 14/11/2028 | 14 |
| .NET 11 | previsto para 10/11/2026 | STS | (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ão | Ano | Principais novidades |
|---|---|---|
| C# 1.0 | 2002 | A base: classes, structs, interfaces, delegates, eventos. |
| C# 2.0 | 2005 | Generics (List<int>), tipos anuláveis (int?), iteradores (yield return), classes parciais. |
| C# 3.0 | 2007 | LINQ, lambdas (x => x * 2), var, métodos de extensão, inicializadores de objetos. |
| C# 4.0 | 2010 | parâmetros opcionais e nomeados, dynamic. |
| C# 5.0 | 2012 | async e await. |
| C# 6.0 | 2015 | interpolação ($"Olá, {nome}"), operador ?., nameof. |
| C# 7.0 a 7.3 | 2017–2018 | tuplas, os primeiros padrões, out var, funções locais, in. O 7.3 é o último do .NET Framework. |
| C# 8.0 | 2019 | referências anuláveis (string?), expressões switch, índices e intervalos (^1, 1..3), ??=. |
| C# 9 | 2020 | instruções de nível superior (o programa sem Main), records, init, padrões com and, or e not. |
| C# 10 | 2021 | global using e os using automáticos, namespace de arquivo, record struct. |
| C# 11 | 2022 | strings literais brutas ("""…"""), required, padrões de lista. |
| C# 12 | 2023 | expressões de coleção ([8, 9, 10]), construtores primários. |
| C# 13 | 2024 | params com qualquer coleção, o novo tipo Lock (aula lock), o escape \e. |
| C# 14 | 2025 | a 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
#errorpediu, 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), eLanguage 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
| Parte | Valor | Quer dizer |
|---|---|---|
| Principal | 10 | O .NET 10 |
| Secundária | 0 | Sempre 0 no .NET atual |
| Faixa de recursos | 1xx | A "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ção | xx12 | A 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 LangVersion | Quer 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 |
preview | Os recursos em teste da próxima versão |
latest | A 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ção | Use |
|---|---|
| Aprender C# (você, agora) | .NET 10 com o C# 14, como o guia |
| Programa novo numa empresa | A LTS mais nova: hoje, o .NET 10 |
| Quer as novidades assim que saem | A STS mais nova (a partir de novembro de 2026, o .NET 11), sabendo que vai precisar atualizar em 2 anos |
| Manter um programa antigo | A versão que ele usa, planejando subir para uma LTS com suporte |
| Programa antigo do Windows em .NET Framework | O .NET Framework 4.8.1 (C# 7.3), ou migrar para o .NET 10 |
Quando dá errado
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.
'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.
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
| .NET | C# | Tipo | Suporte até |
|---|---|---|---|
| .NET 6 | 10 | LTS | encerrado (12/11/2024) |
| .NET 7 | 11 | STS | encerrado (14/05/2024) |
| .NET 8 | 12 | LTS | 10/11/2026 |
| .NET 9 | 13 | STS | 10/11/2026 |
| .NET 10 | 14 | LTS | 14/11/2028 |
| .NET Framework 4.x | 7.3 | (vem com o Windows) | enquanto o Windows o trouxer |
| Comando ou código | Para quê |
|---|---|
dotnet --version | Versão do SDK em uso |
dotnet --list-sdks e --list-runtimes | SDKs e Runtimes instalados |
#error version | Versão do compilador e do C# (erro CS8304) |
#:property LangVersion=12 | Fixar 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.)
3. A pergunta escondida
Complete a linha que faz o compilador contar a versão do C#:
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 --versionmostra o SDK (10.0.112: .NET 10, faixa 1xx, correção 12);#error versionmostra 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.