2009-11-30 11 views
40

En utilisant la réflexion pour obtenir un MethodInfo, je veux tester si le type renvoyé est typeof System.Void.Comment tester si MethodInfo.ReturnType est le type de System.Void?

test si elle est System.Int32 fonctionne très bien

myMethodInfo.ReturnType == typeof(System.Int32) 

mais

myMethodInfo.ReturnType == typeof(System.Void) 

ne compile pas? À l'heure actuelle Im en train de tester si la représentation sous forme de chaîne du nom est "System.Void" qui semble très mauvais.

+1

quelle erreur obtenez-vous lors de la construction de ce code ? –

+0

Si une méthode renvoie Void, cela signifie qu'elle ne renvoie rien, alors pourquoi ne pas inverser la logique et vérifier ce qui pourrait être retourné? Juste une idée ... –

+2

Le compilateur dit "System.Void ne peut pas être utilisé à partir de C# - utilisez typeof (void) pour obtenir le type de vide". Ah, lisez simplement l'erreur. DOH! –

Répondre

53

Vous ne pouvez pas utiliser System.Void directement, mais peut y accéder en utilisant typeof(void).

Plusieurs personnes soulignent (here et dans les commentaires here par exemple) que la raison est que la ECMA Standard 335, la partition II, section 9.4 dit:

The following kinds of type cannot be used as arguments in instantiations (of generic types or methods):

  • Byref types (e.g., System.Generic.Collection.List 1<string&> is invalid)
  • Value types that contain fields that can point into the CIL evaluation stack (e.g., List<System.RuntimeArgumentHandle>)
  • void (e.g., List<System.Void> is invalid)
+14

Im un tel idiot. Le message d'erreur dit "use typeof (void)". –

+2

Plus besoin de cacher la fenêtre d'erreur! ;) Mais c'est terriblement étrange. –

18

Quand je construis, je reçois l'erreur:

System.Void cannot be used from C# -- use typeof(void) to get the void type object

Sons comme la réponse ...

+0

Oui, j'échoue. Aurait accepté la réponse RTFM aussi :) –

Questions connexes