【问题标题】:Why not System.Void? [duplicate]为什么不是 System.Void? [复制]
【发布时间】:2011-06-20 08:56:57
【问题描述】:

可能重复:
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 编译器一起使用,而不是 Microsoft 的编译器,它看起来等同于使用 void 关键字。因此,这一定是编译器强制执行的限制,而不是 CLR 限制,对吧?

【问题讨论】:

  • 我从 Vb.Net 得到相同的异常:'System.Void' 只能用于 GetType 表达式。
  • 另见stackoverflow.com/questions/5450748/what-is-system-void - 它解释了这是编译器强制执行的规则。
  • 其他问题只回答是什么而不是为什么。
  • 我不确定这是不是重复的。另一个问题涉及行为是“什么”。这个问题涉及“为什么”行为是这样的。

标签: c# .net


【解决方案1】:

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

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

System.Void MyMethod() { ... }

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

【讨论】:

  • 你的猜测是正确的!
【解决方案2】:

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

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

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

编辑另外,正如 Eric Lippert 指出的那样,这是因为,例如Void 不是任何事物的超类(实际上,void 是 invariant)。在此处阅读所有相关信息https://docs.microsoft.com/en-us/archive/blogs/ericlippert/the-void-is-invariant

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2016-10-26
    • 1970-01-01
    • 2013-10-02
    • 2018-07-11
    相关资源
    最近更新 更多