使void成为原始类型的设计原理是什么?

cre*_*ire 32 c# language-lawyer

在类型Type.IsPrimitive上使用反射时void返回false.从C++背景中进行复制,这是令人惊讶的.

查看C#6.0规范(页82)未提及void类型,这可能意味着它未完全归类为类型.

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

Pat*_*man 47

为什么不是原始类型的空白?因为它不是你可以实例化的东西.它不是原始类型,也不是引用类型.它什么都没有.

Eric Lippert在这篇关于软件工程的文章中描述了与void类型有关的一些"问题" ,其中详细介绍void了在委托和Actions中使用的类型:

类型系统本质上是一个系统,用于对特定值的哪些操作有效进行逻辑演绎; void返回方法不返回值,因此问题"什么操作对此事件有效?" 根本没有任何意义.对于操作,有效或无效,没有"事情".

void正如埃里克后来解释的那样,使它成为原始类型会破坏VES(虚拟执行系统)的特殊含义和目的:

调用void方法的效果与调用非void方法的效果根本不同; 非void方法总是在堆栈上放置一些东西,可能需要弹出.void方法永远不会在堆栈上放置一些东西.

制作void一个原始类型打破了这个规则,尽管你可以论证它的用处,正如埃里克在引用的帖子中进一步解释的那样.

  • @JörgWMittag这是一种类型,但不能为其分配值. (6认同)
  • 我总是想知道'Type.IsPrimitive`的实用性 - 我从来没有发现它有用的情况. (4认同)
  • @JAB,更准确的是说一个void方法永远不会*在堆栈上留下什么东西(当它返回时).在它的体内,它可以像任何其他方法一样自由地操纵堆栈. (3认同)
  • 不.如果您阅读引用的帖子,您会看到Eric如何解释他们没有选择支持`void`作为泛型类型参数. (2认同)

Han*_*ant 12

void不是类型,它是关键字.就像它在C++中一样,意味着完全相同的东西.关键词在语言中扮演崇高的角色,它们只能出现在某些地方,并且允许解析器对程序员的意图做出严格的假设.

主要作用是生成良好的错误消息.在声明return 42;为void的方法声明中显而易见,你得到一个清晰的"嘿,你说它不会返回任何东西"的错误信息.不太明显的是,它们对于从基本语法错误中恢复非常有用},例如缺少关闭括号是一个非常难以从中恢复的错误.当解析器void在解析方法体时遇到,然后它可以重置解析器状态并再次开始生成良好的错误消息.

System.Void 类型存在完全是与元数据相关的怪癖.粗略等效于C++中的.h文件.它们主要用于处理C++中的技术限制,它没有模块的概念,它使用单通道编译模型并要求声明始终出现在定义之前.在C++中非常痛苦的繁忙工作,虽然编辑器工具可以帮助一点.在C#中没有这样的限制,编译器从定义中生成声明.

元数据详细描述了一种方法,存储在元数据中的MethodDef和MethodDefSig记录中.CLR设计者可以用两种基本方式表达"这种方法不返回数据"的概念.一个显而易见的方法是,他们可以在MethodAttributes枚举中使用一些东西,比如"HasNoReturnValue".但是由于许多方法确实具有非void返回类型,并且在MethodDefSig记录中保留了它的空间,所以它们只选择了一个sentinel值作为返回类型.System.Void.

反映System.Void类型通常不是很有用.实际上,他们可以选择IsPrimitive的任何值,它不会有任何区别.假是一个合乎逻辑的选择,它没有描述一种类型.

  • `int`也是一个关键字. (4认同)
  • 我发现断言`void`不是C(或C++)中的一个类型.N1570(C11草案)6.2.5/19说"`void`类型包含一组空值;它是一个无法完成的不完整对象类型".C++标准在[\ [basic.fundamental \]/9](http://eel.is/c++draft/basic.fundamental#9)中有类似的措辞. (3认同)
  • 叹气,不,`int`是一个关键字,System.int32是一个类型.这种区别也很重要,从现在开始,当每个人都佩戴着256位处理器时,`int`仍然是Int32的别名,这是非常值得怀疑的.C语言认真对待的一课.如果您讨厌它,那么请填写反对意见. (3认同)
  • `for`和`while`也是关键字,它们也不是类型.`void`关键字可以出现在与类型标识符或关键字相同的语义位置,这是一个早于C#多年的决定.至少1977年C被打字,反过来受到Algol 68的启发. (2认同)

Cal*_*ton 8

从阅读C#规范,没有提到类型 void.它被写成一个return type.在目录中,它未按引用或值类型分类.它被称为关键字.

关于该typeof功能的部分说:

typeof-expression的第三种形式包括一个typeof关键字,后跟一个带括号的void关键字.此表单的表达式的结果是System.Type对象,表示缺少类型.typeof(void)返回的类型对象与为任何类型返回的类型对象不同.这种特殊类型对象在允许反射到语言中的方法的类库中很有用,其中这些方法希望有一种方法来表示任何方法的返回类型,包括void方法,以及System.Type的实例.

对我来说,这表明它void有一个相关的类型,但仅用于你想要反射,因为类型系统给你一些有形的东西.否则void只是一个关键字.