Qué es el Sistema.¿Vacío?


sé que los métodos declarados con void no devuelve nada.

Pero parece que en C# void es más que solo una palabra clave, pero un tipo real.
void es un alias para System.Void como int que a System.Int32.

¿Por qué no se me permite usar ese tipo? No tiene ningún sentido, pero estos son solo algunos pensamientos sobre la lógica.

Ni

var nothing = new System.Void();

(que dice que debo usar void (No un alias?))
nor

var nothing = new void();

Compila.

Tampoco es posible usar algo así: {[14]]}

void GiveMeNothing() { }
void GiveMeNothingAgain()
{
    return GiveMeNothing();
}

Entonces, ¿cuál es el punto con System.Void?

 33
Author: shA.t, 2011-03-27

4 answers

De la documentación :

La estructura Void se utiliza en el System.Reflection espacio de nombres, pero es rara vez útil en un típico aplicación. La estructura Void no tiene miembros distintos de los de todos los tipos heredar de la clase Object.

No hay razón para usarlo en código.

También:

var nothing = new void();

Esto no compila para mí. ¿A qué te refieres cuando dices que "funciona"?

Actualización:

Un método void Foo() no devuelve nada. System.Void ¿existe de modo que si se pregunta (a través de la reflexión) "¿cuál es el tipo del valor devuelto ese método?"puedes obtener la respuesta typeof(System.Void). No hay ninguna razón técnica por la que no pueda devolver null en su lugar, pero eso introduciría un caso especial en la API de Reflexión, y se deben evitar casos especiales si es posible.

Finalmente, no es legal que un programa contenga la expresión typeof(System.Void). Sin embargo, esa es una restricción forzada por el compilador, no una CLR uno. De hecho, si prueba el typeof(void) permitido y mira su valor en el depurador, verá que es el mismo valor que sería si typeof(System.Void) fuera legal.

 37
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-27 17:21:04

void/System.Void es diferente de int/System.Int32, es una estructura especial en C#, usada solo para la reflexión. Vea este ejemplo:

class Program
{
   public static void Main(string[] args)
   {
      Type voidType = typeof(Program).GetMethod("Main").ReturnType;
   }
}

Debe haber algún tipo usado para describir el tipo de retorno del método Main aquí, es por eso que tenemos el System.Void.

 15
Author: Danny Chen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-27 17:15:22

Más allá de no devolver un valor, se da muy poca definición de void (aunque void* recibe algo de atención) en la especificación del lenguaje. Esto no es realmente un problema de lenguaje, aunque la CLI puede definirlo aún más.

En última instancia, sin embargo: porque no tiene sentido hacer new void()

 7
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-27 17:14:50

Hemos utilizado el siguiente código

public Type GetType(object o)
{
    var type = o == null ? typeof(void) : o.GetType();
}

Para que podamos usar el patrón de objeto nulo. Es bastante bueno. Esto nos permite hacer cosas como

GetType(o).GetProperties().Select( .....

En lugar de poner cláusulas de guardia en todas partes

 7
Author: llewellyn falco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-30 23:48:36