GOOGLE ADS

vendredi 22 avril 2022

Dans quelles conditions TypeBuilder.CreateType peut-il renvoyer null ?

La TypeBuilder.CreateType()méthode est définie comme nullable:

public Type? CreateType();

Dans quelles conditions peut-il retourner null? La doc ne le dit pas.

Je pourrais creuser dans la source, mais cela donnerait une réponse peu fiable (bien qu'intéressante). Existe-t-il une explication documentée pour cette signature que j'ai manquée ?


Solution du problème

Inter-site-crosspost-ahoy : https://github.com/dotnet/dotnet-api-docs/issues/7955

Sous quelles conditions peut TypeBuilder.CreateType()revenir null?

TL;DR: Il n'y a pas de situation où TypeBuilder.CreateType()retournera nullquand CreateType()est appelé par le code utilisateur. Vous pouvez ajouter en toute sécurité un null-indulgent !à un CreateType()site d'appel.

La source actuelle est à https://github.com/dotnet/runtime/blob/1a296c06fff8750b4658f6f7d901347e006744d0/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs#L1853


  • Une navigation rapide dans la source actuelle montre que TypeBuilder.CreateType()ne revient que nulllorsque TypeBuilderest le générateur de la <Module>classe masquée d'un assembly.

    • La <Module>classe est un type spécial qui permet aux assemblys/modules d'avoir des variables globales initialisées avec impatience.

    • Le langage C# lui-même n'utilise pas <Module>, bien que d'autres langages le fassent (par exemple C++/CLI).

    • Depuis C# 9.0, vous pouvez désormais choisir d'ajouter des <Module>membres via l' [ModuleInitializer]attribut.

    • Bien sûr, si vous utilisez Reflection.Emit, vous aurez toujours pu utiliser ModuleBuilderle retour à.NET 1.x en 2001.



  • <Module>-les TypeBuilderinstances de construction ne peuvent pas être directement instanciées par le code utilisateur car elles nécessitent une internal TypeBuilder()invocation de constructeur spécifique - à la place, ce ctor est appelé uniquement lorsque vous utilisez le ModuleBuildertype.

  • La seule situation où la TypeBuilder.CreateType()méthode revient effectivement nullest à l'intérieur void ModuleBuilder.CreateGlobalFunctions()de, ce qui garantit essentiellement que a class <Module> sera défini dans l'assemblage dynamique généré.

  • Ainsi, bien que l'annotation nullable sur Type? TypeBuilder.CreateType()le type de retour soit techniquement correcte ( le meilleur type de correct ), elle n'est là que parce que la conception actuelle de l'API est médiocre : elle utilise une seule méthode pour deux cas d'utilisation distincts lorsque l'un de ces cas est aussi internal-seulement.

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...