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.