Relações entre os recursos de linguagem e os tipos de bibliotecas

A definição de linguagem C# exige que uma biblioteca padrão tenha determinados tipos e determinados membros acessíveis nesses tipos. O compilador gera o código que usa esses tipos e membros necessários para muitos recursos de linguagem diferentes. Por esse motivo, as versões do C# têm suporte apenas para a versão correspondente do .NET e mais recentes. Isso garante o comportamento correto em tempo de execução e a disponibilidade de todos os tipos e membros necessários.

Essa dependência da funcionalidade da biblioteca padrão faz parte da linguagem C# desde sua primeira versão. Nessa versão, os exemplos incluíam:

  • Exception – usado para todas as exceções geradas pelo compilador.
  • String – sinônimo de string.
  • Int32 – sinônimo de int.

A primeira versão era simples: o compilador e a biblioteca padrão eram fornecidos juntos e havia somente uma versão de cada um.

As versões posteriores do C# ocasionalmente adicionaram novos tipos ou membros às dependências. Os exemplos incluem: INotifyCompletion, CallerFilePathAttribute e CallerMemberNameAttribute. O C# 7.0 adicionou uma dependência em ValueTuple para implementar o recurso de linguagem de tuplas. O C# 8 requer System.Index e System.Range para intervalos e índices, entre outros recursos. Cada nova versão pode adicionar requisitos adicionais.

A equipe de design de linguagem trabalha para minimizar a área de superfície dos tipos e membros necessários em uma biblioteca padrão em conformidade. Essa meta é equilibrada em relação a um design limpo no qual novos recursos de biblioteca são incorporados diretamente na linguagem. Haverá novos recursos em versões futuras do C# que exigem novos tipos e membros em uma biblioteca padrão. As ferramentas do compilador C# agora são desacopladas do ciclo de liberação das bibliotecas .NET em plataformas com suporte.