Error CS0518 Predefined type ‘System.Runtime.CompilerServices.IsExternalInit’ is not defined or imported
Si estás probando .NET 5 en Visual Studio 2019 Preview, y con ello C# 9, es posible que te encuentres con un error de compilación a la hora de trabajar con la característica Init-only properties de la especificación C# 9.
En mi caso, parto de un entorno de desarrollo Visual Studio 2019 Preview 4.0 Version 16.7.0, con .NET 5 Preview 6 (5.0.100-preview.6.20318.15), y por lo tanto y como decía antes, C# 9 como lenguaje de programación.
El problema es que cuando declaro una propiedad con init en lugar de set, el compilador me devuelve un error con el siguiente mensaje:
Error CS0518 Predefined type ‘System.Runtime.CompilerServices.IsExternalInit’ is not defined or imported
Esto no es otra cosa que un bug (aunque desde Microsoft apuntan a que no lo es) que debe ser aún subsanado (se prevé que en la Preview 7 estará resuelto), pero mientras eso ocurre, ¿hay alguna manera de solventar este problema aunque sea para probar esta característica de C# 9?.
La respuesta es sí.
Aclaración sobre el error: El tipo IsExternalInit es un nuevo tipo agregado a .NET 5 y que es necesario para registrar los tipos correctamente y sus propiedades de inicio. El tipo fue añadido pero no agregado al SDK de .NET 5, por lo que al usar esta característica del lenguaje, se produce el error mencionado. Microsoft no lo define como bug porque está agregado, aunque el olvido de incluirlo en .NET 5 SDK representa para unos un bug, y para otros una issue. El caso es que imposibilita el uso de esta característica de C# de forma directa. Desde Microsoft se indica que en la Preview 7 este error desaparecerá y no será necesario realizar ningún work around. Para más información, haz clic aquí.
Basta con indicar el siguiente código:
namespace System.Runtime.CompilerServices { public class IsExternalInit { } }
Y de esta forma, el compilador dejará de dar este error y nos permitirá usar y ejecutar nuestro código utilizando la característica del lenguaje Init-only properties.
En un futuro próximo, espero poder entrar en detalle en las características más destacables de la nueva especificación del lenguaje C# 9 como he hecho con las especificaciones anteriores.
Mientras tanto, espero que esto te ayude en el caso de querer probar esta sintáxis y encontrarte con este error.
Happy Coding!