为什么不选择System.Void

本文关键字:Void System 选择 为什么不 | 更新日期: 2023-09-27 17:59:29

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

为什么不选择System.Void

我认为这个结构的唯一目的是在反射中使用它,而其他类型(如System.StringSystem.Int32等)是保存数据的适当类型。System.Void不携带任何数据,并且不能从代码中实例化此结构。

我对编译器错误的猜测是,它是为了增强代码的一致性。有这样的方法看起来会很奇怪:

System.Void MyMethod() { ... }

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

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

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

使用typeof(void)在语法上是非法的。这遵循最小惊奇的原则

编辑此外,正如Eric Lippert所指出的,这是因为,例如,Void不是任何事物的超类(事实上,Void是不变量)。在此处阅读全部内容https://learn.microsoft.com/en-us/archive/blogs/ericlippert/the-void-is-invariant