什么是System.Void?

ord*_*dag 37 .net c# void

我知道声明的方法void不会返回任何内容.

但似乎在C#void中只是一个关键字,而是一个真实的类型.
void是一个别名System.Void就像int那是System.Int32.

为什么我不允许使用那种类型? 它没有任何意义,但这只是对逻辑的一些想法.

也不

var nothing = new System.Void();
Run Code Online (Sandbox Code Playgroud)

(说我应该使用void(不是别名?))
也不是

var nothing = new void();
Run Code Online (Sandbox Code Playgroud)

编译.

也不可能使用这样的东西:

void GiveMeNothing() { }
void GiveMeNothingAgain()
{
    return GiveMeNothing();
}
Run Code Online (Sandbox Code Playgroud)

那么重点是什么System.Void

Jon*_*Jon 40

文档:

Void结构在 System.Reflection命名空间中使用,但在典型应用程序中很少使用.Void除了从Object类继承的所有类型之外,该结构没有其他成员.

在代码中没有理由真正使用它.

也:

var nothing = new void();
Run Code Online (Sandbox Code Playgroud)

这不适合我编译.说"有效"时你是什么意思?

更新:

方法void Foo()不返回任何内容.System.Void那么如果你问(通过反思)"那个方法的返回值的类型是什么?",你就可以得到答案typeof(System.Void).没有技术原因它无法返回null,但这将在Reflection API中引入一个特殊情况,并且如果可能的话应避免特殊情况.

最后,程序包含表达式是不合法的typeof(System.Void).但是,这是一个编译器强制限制,而不是CLR限制.实际上,如果您尝试允许typeof(void)并在调试器中查看其值,您将看到它与typeof(System.Void)合法时的值相同.

  • @ordag:你的方法没有返回任何*.`System.Void`就在那里,如果你问'`void Foo()`的返回值是什么类型?',它可以用`typeof(System.Void)`来回答你.毕竟,它必须用*某些东西来回答你. (3认同)
  • 我不认为这只是'Type`反射.我假设CLR在其元数据中也使用它来表示`void`方法的返回类型.毕竟,CLR必须以某种方式表示返回类型.拥有伪类型是一种自然的选择. (2认同)

Che*_*hen 17

void/ System.Voidint/ 不同System.Int32,它是C#中的特殊结构,仅用于反射.看这个例子:

class Program
{
   public static void Main(string[] args)
   {
      Type voidType = typeof(Program).GetMethod("Main").ReturnType;
   }
}
Run Code Online (Sandbox Code Playgroud)

必须使用某种类型来描述Main方法的返回类型,这就是我们拥有的方法System.Void.


lle*_*lco 8

我们使用了以下代码

public Type GetType(object o)
{
    var type = o == null ? typeof(void) : o.GetType();
}
Run Code Online (Sandbox Code Playgroud)

这样我们就可以使用null对象模式.这是相当不错.这允许我们做类似的事情

GetType(o).GetProperties().Select( .....
Run Code Online (Sandbox Code Playgroud)

而不是在任何地方放置警卫条款


Mar*_*ell 7

除了不返回值之外,在语言规范中给出了很少的定义void(虽然void*得到一些关注).这不是真正的语言问题 - 尽管CLI可能会进一步定义它.

但最终:因为它没有任何意义 new void()