我知道用void
声明的方法不会返回任何内容。
但似乎在C#中void
不仅仅是一个关键字,而是一个真实的类型
void
是System.Void
的别名,例如int
的{{1}}。
为什么我不允许使用该类型? 这没有任何意义,但这只是对逻辑的一些想法。
无论
System.Int32
(说我应该使用var nothing = new System.Void();
(不是别名?))
也不
void
编译。
也不可能使用类似的东西:
var nothing = new void();
关于void GiveMeNothing() { }
void GiveMeNothingAgain()
{
return GiveMeNothing();
}
?
答案 0 :(得分:40)
Void
结构用于System.Reflection
命名空间,但是 在典型的情况下很少有用 应用。Void
结构没有 除了所有类型的成员 继承自Object
类。
没有理由在代码中真正使用它。
此外:
var nothing = new void();
这不适合我。说“有效”是什么意思?
<强>更新强>
方法void Foo()
不会返回任何内容。 System.Void
是这样的,如果您(通过反射)询问“该方法返回值的类型是什么?”,您可以得到答案typeof(System.Void)
。没有技术原因它无法返回null
,但这会在Reflection API中引入一个特殊情况,并且如果可能的话应该避免特殊情况。
最后,程序包含表达式typeof(System.Void)
是不合法的。但是,这是编译器强制限制,而不是CLR限制。实际上,如果您尝试使用允许的typeof(void)
并在调试器中查看其值,您会看到它与typeof(System.Void)
合法时的值相同。
答案 1 :(得分:16)
void
/ System.Void
与int
/ System.Int32
不同,它是C#中的特殊结构,仅用于反射。见这个例子:
class Program
{
public static void Main(string[] args)
{
Type voidType = typeof(Program).GetMethod("Main").ReturnType;
}
}
这里必须使用一些类型来描述Main
方法的返回类型,这就是我们拥有System.Void
的原因。
答案 2 :(得分:8)
我们使用了以下代码
public Type GetType(object o)
{
var type = o == null ? typeof(void) : o.GetType();
}
这样我们就可以使用null对象模式了。这是相当不错。 这允许我们做像
这样的事情GetType(o).GetProperties().Select( .....
而不是在任何地方放置警卫条款
答案 3 :(得分:7)
除了不返回值之外,在语言规范中给出void
(尽管void*
得到一些关注)的定义很少。这不是真正的语言问题 - 尽管CLI可能会进一步定义它。
最终:因为它没有意义new void()