2009-11-30 8 views
40

Usando la reflexión para obtener un MethodInfo, quiero probar si el tipo devuelto es typeof System.Void.Cómo probar si MethodInfo.ReturnType es un tipo de System.Void?

Prueba si se trabaja bien System.Int32

myMethodInfo.ReturnType == typeof(System.Int32) 

pero

myMethodInfo.ReturnType == typeof(System.Void) 

no compila? En este momento estoy probando si la representación de la cadena del nombre es "System.Void", que parece muy incorrecta.

+1

qué error te va en la construcción de ese código ? –

+0

Si un método devuelve Void, significa que no devuelve nada, entonces, ¿por qué no invertir la lógica y verificar lo que podría devolverse? Solo una idea ... –

+2

El compilador dice "System.Void no se puede usar desde C# - use typeof (void) para obtener el tipo de vacío". Ah, acaba de leer el error. DOH! –

Respuesta

53

No se puede utilizar directamente System.Void, pero puedo acceder a él mediante typeof(void).

Varias personas señalan (here y en los comentarios here por ejemplo) que la razón de esto es que el ECMA Standard 335, partición II, sección 9.4 dice:

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

Soy un idiota. El mensaje de error dice "use typeof (void)". –

+2

¡No más ocultando la ventana de error! ;) Pero es terriblemente extraño. –

18

Cuando construyo esto, me sale el error:

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

Suena como esa es la respuesta ...

+0

Sí, fallo. Hubiera aceptado la respuesta RTFM también :) –

Cuestiones relacionadas