2009-11-30 2 views
40

Mit Reflection, um eine MethodInfo zu erhalten, möchte ich testen, ob der Typ typeof System.Void zurückgegeben wird.Wie wird getestet, ob MethodInfo.ReturnType vom Typ System.Void ist?

Testing, wenn es System.Int32 funktioniert

myMethodInfo.ReturnType == typeof(System.Int32) 

aber

myMethodInfo.ReturnType == typeof(System.Void) 

lässt sich nicht kompilieren? Derzeit bin ich im Test, wenn die String-Darstellung des Namens "System.Void" ist, was sehr falsch scheint.

+1

welche Fehlermeldung erhalten Sie, wenn Sie diesen Code Bau ? –

+0

Wenn eine Methode Void zurückgibt, heißt das, dass sie nichts zurückgibt. Warum also nicht die Logik umkehren und prüfen, was zurückgegeben werden könnte? Nur eine Idee ... –

+2

Compiler sagt "System.Void kann nicht von C# verwendet werden - verwenden Sie typeof (void), um den void-Typ zu erhalten". Ah, lies einfach den Fehler. DOH! –

Antwort

53

Sie nicht System.Void direkt verwenden können, aber es kann typeof(void) mit zuzugreifen.

Mehrere Menschen weisen darauf hin (here und in den Kommentaren here zum Beispiel), dass der Grund dafür ist, dass die ECMA Standard 335, Partition II, Abschnitt 9.4 sagt:

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

Ich bin so ein Idiot. Die Fehlermeldung lautet "use typeof (void)". –

+2

Kein Verstecken des Fehlerfensters mehr! ;) Aber es ist furchtbar seltsam. –

18

Als ich das bauen, erhalte ich die Fehlermeldung:

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

Klingt, dass die Antwort ist ...

+0

Ja, ich scheitere. Hätte RTFM auch angenommen :) –