Relaciones entre características de lenguaje y tipos de biblioteca

La definición del lenguaje C# exige que una biblioteca estándar tenga determinados tipos y determinados miembros accesibles en esos tipos. El compilador genera código que usa estos miembros y tipos necesarios para muchas características de lenguaje diferentes. Por este motivo, las versiones de C# solo se admiten para la versión correspondiente de .NET y versiones más recientes. Esto garantiza el comportamiento correcto en tiempo de ejecución y la disponibilidad de todos los tipos y miembros necesarios.

Esta dependencia de la funcionalidad de la biblioteca estándar ha formado parte del lenguaje C# desde su primera versión. En esa versión, los ejemplos incluían:

  • Exception : se usa para todas las excepciones generadas por el compilador.
  • String: sinónimo de string.
  • Int32: sinónimo de int.

Esa primera versión era simple: el compilador y la biblioteca estándar se distribuían juntos y solo había una versión de cada uno.

Las versiones posteriores de C# a veces han agregado nuevos tipos o miembros a las dependencias. Algunos ejemplos son: INotifyCompletion, CallerFilePathAttributey CallerMemberNameAttribute. C# 7.0 agregó una dependencia de ValueTuple para implementar la característica de lenguaje tuplas. C# 8 requiere System.Index y System.Range para intervalos e índices, entre otras características. Cada nueva versión puede agregar requisitos adicionales.

El equipo de diseño del lenguaje se esfuerza por minimizar el área expuesta de los tipos y miembros necesarios en una biblioteca estándar compatible. Ese objetivo está equilibrado con un diseño limpio donde las nuevas características de la biblioteca se han incorporado sin problemas al lenguaje. Habrá nuevas características en versiones futuras de C# que exijan nuevos tipos y miembros en una biblioteca estándar. Las herramientas del compilador de C# ahora se han desvinculado del ciclo de versiones de las bibliotecas de .NET en las plataformas compatibles.