typeof (T) peut renvoyer null

Lors de l’utilisation de l’opérateur typeof sur le type créé via TypeBuilder, l’opérateur renvoie la valeur null.

Je suis curieux de savoir pourquoi cela se produit et comment l’empêcher.


Je commence à penser que c’est un bogue VS dans la fenêtre immédiate, mais je ne suis pas tout à fait sûr. Il est très facile de blâmer les autres d’abord.

Ok … code pour reproduire le problème:

  static void Main() { AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( new AssemblyName("MyAssembly"), AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule"); TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAtsortingbutes.Public, typeof(ArrayList)); ArrayList o = (ArrayList)Activator.CreateInstance(typeBuilder.CreateType()); Console.WriteLine(o.GetType().Name); } 

Si vous mettez un point d’arrêt après la variable o et tapez typeof(MyType) dans le Windows Immediate, vous aurez le problème.

    Lors de l’utilisation de l’opérateur typeof sur le type créé via TypeBuilder, l’opérateur renvoie la valeur null.

    Tout d’abord, l’affirmation est correcte. Si vous écrivez ce programme, puis l’arrêtez dans le débogueur et dites “typeof (MyType)” dans la fenêtre immédiate, le résultat renvoyé est “null”.

    Je suis curieux de savoir pourquoi cela se produit

    Beats the heck out of me. Si je devais deviner, je dirais que peut-être l’évaluateur d’expression communique avec le sous-système de débogage du CLR pour essayer d’obtenir un jeton de métadonnées pour le type par son nom, et le CLR renvoie un jeton garbage nil plutôt que de générer une erreur. .

    Je m’empresse de souligner qu’il s’agit d’une supposition; Je ne l’ai pas réellement débogué.

    Je commence à penser que c’est un bogue VS dans la fenêtre immédiate

    Cela semble probable. La bonne chose à faire est de donner à l’erreur “le type ou l’espace de noms ‘MyType’ n’est pas valide dans cette scope”. Le bogue sera presque certainement dans l’évaluateur d’expression C # et non dans la fenêtre immédiate.

    Merci d’avoir porté le problème à mon attention. Je vais déposer un bogue avec les responsables de l’évaluateur d’expression et nous verrons s’ils peuvent résoudre le problème.

    comment l’empêcher?

    Si ça fait mal quand vous tapez “typeof (MyType)”, alors arrêtez de taper cela.

    Si vous mettez un point d’arrêt après la variable ‘o’ et tapez typeof (MyType) dans le Windows Immediate, vous aurez le problème.

    Ben ouais. MyType n’a pas de symbole (vous le définissez en utilisant la reflection!), Vous ne pouvez donc pas utiliser le typeof dessus.

    Edit: pour plus de clarté, il existe une seule fois où vous pouvez utiliser typeof et obtenir un type créé à l’exécution: lorsque vous utilisez des génériques.

     Type MyMethod() where T : class { return typeof(T); } Type myType = //create type dynamically; Type myOtherType = //invoke MyMethod with myType as the type parameter Debug.Assert(myType == myOtherType); //will not fire