哪些设计决策主张void
不能构造且不允许作为泛型类型?毕竟,这只是一个特殊的空struct
和本来可以避免具有不同的总PITA Func
和Action
代表。
(C ++允许显式void
返回并允许void
作为模板参数)
哪些设计决策主张void
不能构造且不允许作为泛型类型?毕竟,这只是一个特殊的空struct
和本来可以避免具有不同的总PITA Func
和Action
代表。
(C ++允许显式void
返回并允许void
作为模板参数)
Answers:
“ void”的根本问题是,它与任何其他返回类型的含义不同。“ void”表示“如果此方法返回,则它根本不返回任何值。” 不为null;null是一个值。它不返回任何值。
这确实弄乱了类型系统。类型系统本质上是一个逻辑推论哪些操作对特定值有效的系统。无效的返回方法不会返回任何值,因此问题“对此内容有效的操作是什么?” 根本没有任何意义。对于有效或无效的操作,没有“事物”。
而且,这使运行时变得有些混乱。.NET运行时是虚拟执行系统的实现,该系统被指定为堆栈计算机。也就是说,根据操作对评估堆栈的影响来表征所有操作的虚拟机。(当然,实际上,该机器将在具有堆栈和寄存器的机器上实现,但虚拟执行系统仅假定一个堆栈。)从根本上说,调用void方法的效果与调用非无效方法的效果不同;非无效方法总是将某些东西放到堆栈上,这可能需要弹出。void方法永远不会在堆栈中放入任何内容。因此,在忽略方法的返回值的情况下,编译器无法将void和non-void方法视为相同。如果该方法无效,则没有返回值,因此必须没有弹出。
由于所有这些原因,“ void”不是可以实例化的类型;它没有价值,这就是重点。它不能转换为对象,并且void返回方法永远不能用非void返回方法进行多态处理,因为这样做会破坏堆栈!
因此,正如您所指出的,void不能用作类型参数,这很可惜。这将非常方便。
借助事后看来,如果一个空返回方法自动返回一个神奇的单例引用类型“ Unit”,而不是什么都没有,那么对所有相关人员会更好。然后,您将知道每个方法调用都将某些内容放入堆栈中,您将知道每个方法调用都返回可分配给对象类型变量的内容,并且当然Unit可用作类型参数,因此会有不需要具有单独的Action和Func委托类型。可悲的是,这不是我们所处的世界。
有关此方面的更多想法,请参见:
Void
应该可以将其作为0个堆栈字节内的无限数量的参数进行传递。当任何结构需要转换为object
或调用方法(获取this
)时,将其放在堆中,并Type
在内存的字段区域之前插入引用(对于许多CLR实现),因此可以被正确处理。对于我来说,类型仅仅是可以通过某些特征(字段)加以区分的一组对象。Void
只是一个对象。
void
为空值类型,则该语句将转换为零机器码指令。对于的硬编码类型不是很有用Void
,但是在类型具有多个通用参数但在某些情况下不需要某些泛型参数的情况下很有用。
来自:http : //connect.microsoft.com/VisualStudio/feedback/details/94226/allow-void-to-be-parameter-of-generic-class-if-not-in-c-then-just-in-运行
这实际上是设计使然-我们不允许void类型的任何实例(以及运行时中的许多其他类型)。您也不能将CreateInstance设为void或void []。为了安全起见,我们堵塞了这些类型的孔。
我一辈子都看不到安全漏洞是多么的空洞,但是……这样说。