我知道声明的方法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)合法时的值相同.
Che*_*hen 17
void/ System.Void与int/ 不同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.
我们使用了以下代码
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)
而不是在任何地方放置警卫条款
除了不返回值之外,在语言规范中给出了很少的定义void(虽然void*得到一些关注).这不是真正的语言问题 - 尽管CLI可能会进一步定义它.
但最终:因为它没有任何意义 new void()