为什么不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