为什么不System.Void?

Ste*_*art 20 .net c#

可能重复:
什么是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限制,对吧?

Isa*_*avo 19

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

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

System.Void MyMethod() { ... }
Run Code Online (Sandbox Code Playgroud)

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

  • 你的推测是正确的! (15认同)

seh*_*ehe 6

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

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

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

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