nulo como um tipo . Por que diabos o "vazio" é um tipo? Não possui instâncias, não possui valores, não é possível usá-lo como argumento de tipo genérico, tipo de parâmetro formal, tipo local, tipo de campo ou tipo de propriedade. Não tem significado como um tipo; pelo contrário, é um fato sobre o efeito que uma chamada de método tem na pilha da máquina virtual. Mas a máquina virtual é exatamente isso: uma máquina virtual. A máquina real colocará o valor retornado em um registro (normalmente EAX em x86) e não afetará a pilha! O vazio como um tipo é apenas uma péssima idéia.
Pior: quando usado em um tipo de ponteiro void*
, significa algo completamente diferente do que significa quando usado como um tipo de retorno. Agora, significa "um ponteiro para um local de armazenamento de tipo desconhecido", que não tem nada a ver com seu significado como "um método que não retorna nenhum valor".
Podemos substituir void*
como um tipo de ponteiro por IntPtr
. (E void**
com IntPtr*
e assim por diante.) Podemos substituir void como um tipo de retorno por "Unit", um tipo que possui um valor único, ou seja, nulo. Uma implementação do CLR poderia então decidir que uma chamada de função do tipo unidade poderia otimizar seu uso de registradores ou pilhas adequadamente, sabendo que o nulo que está sendo "retornado" pode ser ignorado com segurança.
Nesse mundo, você não precisa mais se separar Func<A, R>
e Action<T>
delegar. Action<T>
é justo Func<T, Unit>
.