C#void type- safety

我是C#编程的新手(来自C ++)

我的问题是:在C#中,每个类型都inheritance自Object为什么’void’不会?它会导致一些RT /类型安全问题,还是只是语义/语法?

(我知道int / char等’基本类型’和使用装箱/拆箱 – 我的问题是针对void的)

谢谢

在C#中, void是在两个上下文中使用的关键字:

  • 在方法签名的上下文中, void表示没有返回类型; 它不引用可以从objectinheritance的类型“void”。

    (在reflection中,总是要指定一个返回类型。因此,框架中有一个System.Void类型,但voidSystem.Void不能互换使用。)

  • 在不安全的上下文中, void*是未知类型的指针类型。 正如@Colin Mackay链接的博客文章中所提到的 ,指针类型不会从objectinheritance,尽管它们可以转换为一个。

并非所有东西都从Objectinheritance – 这是一个普遍的神话。 接口不从Objectinheritance。

有关详细信息,请参阅此处 : http : //blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx

与C ++不同,C#仅允许void关键字指定方法没有返回类型。

在C#中,void关键字作为方法参数无效。 但是,在C ++中,void可用于指定“通用”指针。

对此规则的一个警告是使用不安全的代码 ,这在C#中通常是不必要的。

编辑:与其他人发布的内容相反,void和System.Void之间存在差异。 除了struct System.Void之外,还有一个void关键字。 该关键字用于指示方法没有返回类型。 另一方面,System.Void在reflection中用于询问方法返回的类型(System.Void可能有其他用途,但我不知道任何用途)。

C#void关键字
C ++ void关键字

虚空不是一种物体。 这是一种什么都没有。 至少在C#中,使用单词void的唯一时间是函数返回类型,因此它意味着该函数不返回任何内容。 不存在的东西不能来自任何东西。 使用它的唯一其他地方是在不安全的上下文中,引用指针,它也不是从Object派生的。

Void是一个Type,但返回void的方法不会将任何东西压入堆栈。 System.Void被声明为一个struct,因此它也应该从objectinheritance,但它的处理方式不同。 在调用返回void的方法之后,如果查看IL代码,可以看到更清楚,没有pop指令,通常用于从堆栈中弹出未使用的返回值。

编辑:其实,我检查过。 如果我声明一个方法作为返回System.Void,我收到一条错误消息,指出System.Void不能从C#代码中使用。 但请尝试以下方法:

 typeof(object).IsAssignableFrom(typeof(void)) typeof(System.ValueType).IsAssignableFrom(typeof(void)) 

将返回true,因此void派生自object和System.ValueType(即struct)