什么是System.Void?

时间:2011-03-27 17:01:28

标签: c# .net void

我知道用void声明的方法不会返回任何内容。

但似乎在C#中void不仅仅是一个关键字,而是一个真实的类型 voidSystem.Void的别名,例如int的{​​{1}}。

为什么我不允许使用该类型? 这没有任何意义,但这只是对逻辑的一些想法。

无论

System.Int32

(说我应该使用var nothing = new System.Void(); (不是别名?))
也不

void

编译。

也不可能使用类似的东西:

var nothing = new void();

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

的重点是什么?

4 个答案:

答案 0 :(得分:40)

来自documentation

  

Void结构用于   System.Reflection命名空间,但是   在典型的情况下很少有用   应用。 Void结构没有   除了所有类型的成员   继承自Object类。

没有理由在代码中真正使用它。

此外:

var nothing = new void();

这不适合我。说“有效”是什么意思?

<强>更新

方法void Foo()不会返回任何内容。 System.Void是这样的,如果您(通过反射)询问“该方法返回值的类型是什么?”,您可以得到答案typeof(System.Void)。没有技术原因它无法返回null,但这会在Reflection API中引入一个特殊情况,并且如果可能的话应该避免特殊情况。

最后,程序包含表达式typeof(System.Void)是不合法的。但是,这是编译器强制限制,而不是CLR限制。实际上,如果您尝试使用允许的typeof(void)并在调试器中查看其值,您会看到它与typeof(System.Void)合法时的值相同。

答案 1 :(得分:16)

void / System.Voidint / System.Int32不同,它是C#中的特殊结构,仅用于反射。见这个例子:

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

这里必须使用一些类型来描述Main方法的返回类型,这就是我们拥有System.Void的原因。

答案 2 :(得分:8)

我们使用了以下代码

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

这样我们就可以使用null对象模式了。这是相当不错。 这允许我们做像

这样的事情
GetType(o).GetProperties().Select( .....

而不是在任何地方放置警卫条款

答案 3 :(得分:7)

除了不返回值之外,在语言规范中给出void(尽管void*得到一些关注)的定义很少。这不是真正的语言问题 - 尽管CLI可能会进一步定义它。

最终:因为它没有意义new void()