Le type prédéfini 'System.Runtime.CompilerServices.IsExternalInit' n'est pas défini ou importé [duplicate]
J'ai rencontré ce problème lors du test des nouvelles fonctionnalités de C # 9 avec Visual Studio 2019 Preview. Je testais l'init setter, mais le compilateur affiche une erreur avec le message:
Erreur CS0518 Le type prédéfini «System.Runtime.CompilerServices.IsExternalInit» n'est pas défini ou importé. Voici l'extrait de code que j'ai essayé:
public class Book
{
string ISBN { get; init; }
}
Réponses
Il s'agit d'un petit bogue dans Visual Studio 2019 qui n'a pas encore été corrigé. Pour résoudre ce problème, vous devez ajouter une classe factice nommée IsExternalInitavec l'espace de noms System.Runtime.CompilerServicesn'importe où dans votre projet. Cela le fera.
Si vous écrivez une bibliothèque, il est préférable de rendre cette classe interne, sinon vous pouvez vous retrouver avec deux bibliothèques définissant toutes les deux le même type.
namespace System.Runtime.CompilerServices
{
internal static class IsExternalInit {}
}
Edit (16 novembre 2020):
Selon une réponse que j'ai reçue du développeur principal de l'équipe du langage C #, Jared Parsons, le problème ci-dessus n'est pas un bogue. Le compilateur renvoie cette erreur car nous compilons un code .NET 5 par rapport à une version plus ancienne de .NET Framework. Voir son message ci-dessous:
Merci d'avoir pris le temps de signaler ce problème de rétroaction. Malheureusement, ce n'est pas un bug. Le
IsExternalInittype n'est inclus que dans lesnet5.0(et futurs) frameworks cibles. Lors de la compilation avec des frameworks cibles plus anciens, vous devrez définir manuellement ce type.
Lien vers le rapport sur la communauté des développeurs Visual Studio: https://developercommunity.visualstudio.com/content/problem/1244809/error-cs0518-predefined-type-systemruntimecompiler.html
Si vous souhaitez rester avec .NET Core App 3.1, vous devrez ajouter le type comme Kinin Roza expliqué dans ce rapport de bogue .
Cependant, si vous modifiez votre csprojpour avoir le <TargetFramework>jeu sur net5.0, cela résoudra votre problème car ce type n'est défini que dans 5.0.
Voici mon exemple de csprojfichier d' application Console .
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>