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 null
quand 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 quenull
lorsqueTypeBuilder
est 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 utiliserModuleBuilder
le retour à.NET 1.x en 2001.
- La
<Module>
-lesTypeBuilder
instances de construction ne peuvent pas être directement instanciées par le code utilisateur car elles nécessitent uneinternal TypeBuilder()
invocation de constructeur spécifique - à la place, ce ctor est appelé uniquement lorsque vous utilisez leModuleBuilder
type.- La seule situation où la
TypeBuilder.CreateType()
méthode revient effectivementnull
est à l'intérieurvoid ModuleBuilder.CreateGlobalFunctions()
de, ce qui garantit essentiellement que aclass <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 aussiinternal
-seulement.
Aucun commentaire:
Enregistrer un commentaire