为什么不System.Void?

时间:2011-06-20 08:56:58

标签: c# .net

  

可能重复:
  What is System.Void?

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

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

  

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

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

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

2 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:6)

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

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

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

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