C# 使void不是原始类型的设计原理是什么?

C# 使void不是原始类型的设计原理是什么?,c#,language-lawyer,C#,Language Lawyer,当使用反射类型时, 空白>代码>返回false。C++背景下,这是令人惊讶的。 查看(第82页)没有提到void类型,这可能意味着它没有被完全归类为一种类型 语言规范中是否有任何东西将void归类为其他内容。或任何其他讨论或提及其背后原因的讨论?阅读C规范时,没有提及类型无效。它被写成一个返回类型。在目录中,它不属于参考或值类型。它被作为一个关键词提到 typeof函数的部分说明: typeof表达式的第三种形式由一个typeof关键字和一个带括号的void关键字组成。此表单表达式的结果是Sys

当使用反射<代码>类型时,<<原始> <代码> > <代码>空白>代码>返回false。C++背景下,这是令人惊讶的。 查看(第82页)没有提到
void
类型,这可能意味着它没有被完全归类为一种类型

语言规范中是否有任何东西将
void
归类为其他内容。或任何其他讨论或提及其背后原因的讨论?

阅读C规范时,没有提及类型
无效。它被写成一个
返回类型
。在目录中,它不属于参考或值类型。它被作为一个关键词提到

typeof
函数的部分说明:

typeof表达式的第三种形式由一个typeof关键字和一个带括号的void关键字组成。此表单表达式的结果是System.Type对象,表示缺少类型。typeof(void)返回的type对象不同于为任何类型返回的type对象。此特殊类型对象在类库中非常有用,类库允许对语言中的方法进行反射,这些方法希望能够用System.type实例表示任何方法(包括void方法)的返回类型


对我来说,这表明
void
有一个关联的类型,但仅在您希望反射由于类型系统而给您一些有形的东西的情况下使用。否则,
void
只是一个关键字

为什么void不是一个基本类型?因为它不是你可以实例化的东西。它不是基元类型,也不是引用类型。这根本没什么

Eric Lippert介绍了中void类型的一些“问题”,其中详细介绍了
void
作为代理和
操作中使用的类型:

类型系统本质上是一个对特定值的有效操作进行逻辑推断的系统;void返回方法不会返回值,所以“什么操作对这个东西有效?”这个问题根本没有任何意义。没有什么“东西”可以让操作生效或无效

将其作为一种原始类型会破坏VES(虚拟执行系统)中
void
的特殊含义和用途,Eric在后面解释道:

调用void方法的效果与调用非void方法的效果根本不同;非void方法总是在堆栈上放置一些可能需要弹出的内容。void方法从不在堆栈上放置任何内容


void
设置为基元类型违反了这一规则,尽管您可能会认为其有用,正如Eric在文章中进一步解释的那样。

void
不是一个类型,而是一个关键字。就像C++一样,意思是完全一样的东西。关键字在语言中扮演着重要的角色,它们只能出现在特定的地方,解析器可以对程序员的意图做出艰难的假设

主要作用是生成良好的错误消息。在
return 42这样的语句中很明显}
右括号是一个很难恢复的错误。当解析器在解析方法体时遇到
void
时,它可以重置解析器状态并再次开始生成正确的错误消息

System.Void
类型的存在是与元数据相关的一个怪癖。C++中的粗略等价于.h文件。它们主要用于处理C++中的技术限制,它没有模块的概念,它使用单遍编译模型,要求声明总是出现在定义之前。非常痛苦的C++工作,尽管编辑器工具可以帮助你。在C#中没有这样的限制,编译器根据定义生成声明

元数据详细描述了一个方法,存储在MethodDef和MethodDefSig记录的元数据中。CLR设计者可以用两种基本方式表达“此方法不返回数据”的概念。一个明显的方法是,他们可以在中使用一些,比如“HasNoReturnValue”。但是,由于许多方法都有非void返回类型,并且MethodDefSig记录中保留了非void返回类型的空间,因此它们只是选择了一个sentinel值作为返回类型。系统无效


反映在系统上。空洞类型通常不有用。实际上,他们可以为IsPrimitive选择任何值,这不会有任何区别。False是一个合乎逻辑的选择,它不描述一种类型。

@和YKORNEYEV yes,以及
bool
double
等,它们都被称为
布尔类型
无效类型
。@MatthewWatson yes,OP知道这一点。问题是为什么。它的实现可以使
typeof(void).IsPrimitive
返回
true
,现在的问题是:有没有什么特别的理由不这样做(比如从其他原语支持的功能中轻松导出
void
)?这是一个学术问题,你可能是对的,它没有什么有趣的地方,但如果有,我也想知道。@Jeroenvanevel你提出的问题是错误的
void
是一种特殊类型,但它仍然是一种类型<代码>类型(无效)
合法。所以问题仍然是,它应该是一个原始类型吗?什么是原始类型?(如果我没记错的话,有多种定义)关于基于意见的近距离投票,我希望更多的人能够认识到最初的设计决策显然是有意见的,但是