为什么不System.Void?

可能重复:
什么是System.Void?

我没有实际理由知道这个答案,但无论如何我很好奇……

在C#中,尝试使用System.Void会产生编译错误:

错误CS0673:无法从C#中使用System.Void – 使用typeof(void)获取void类型对象

据我所知, void只是System.Void的别名。 因此,我不明白为什么’System.Void’不能直接使用,例如’System.String’的’string’。 我很乐意为此阅读解释!

顺便说一下, System.Void可以成功地与Mono编译器一起使用,而不是微软的,并且它看起来等同于使用void关键字。 因此,这必须是编译器强制执行的限制而不是CLR限制,对吧?

我相信这个结构的唯一目的是在reflection中使用它,而其他类型(如System.String,System.Int32等)是保存数据的正确类型。 Void不携带任何数据,您无法从代码中实例化此结构。

我对编译器错误的猜测是它在那里强制执行代码的一致性。 有这样的方法会很奇怪:

 System.Void MyMethod() { ... } 

乍一看,它似乎正在回归,而实际上并没有。 在我看来,这是C#团队的一个很好的决定(如果我对它的推测是正确的)

也许是因为如果允许System.Void作为类型引用,它可能会开始出现

  • 函数声明(返回类型) – 这显然是合法的
  • 参数声明
  • 模板参数声明
  • 变量声明

使用typeof(void)会使语法非法。 这遵循最少惊喜的原则

编辑另外,正如Eric Lippert所指出的,这是因为,例如Void不是任何东西的超类(事实上,虚空是不变的 )。 在这里阅读所有相关内容http://blogs.msdn.com/b/ericlippert/archive/2009/06/29/the-void-is-invariant.aspx