порожнеча як тип . Чому на землі "недійсний" тип? У нього немає примірників, у нього немає значень, ви не можете використовувати його як аргумент загального типу, формальний тип параметра, локальний тип, тип поля або тип властивості. Він не має значення як тип; швидше, це факт про те, який ефект має виклик методу на стек віртуальної машини. Але віртуальна машина - це саме це: віртуальна машина. Справжня машина поставить повернене значення в регістр (як правило, EAX на x86) і взагалі не вплине на стек! Пустота як тип - лише погана ідея навколо.
Гірше: коли використовується в типі вказівника, оскільки void*
він щось означає зовсім інше, ніж те, що воно означає, коли використовується як тип повернення. Тепер це означає "вказівник на місце зберігання невідомого типу", який не має нічого спільного зі своїм значенням як "метод, який не повертає жодного значення".
Ми можемо замінити void*
як тип вказівника на IntPtr
. (І void**
сIntPtr*
і так далі.) Ми можемо замінити void як тип повернення на "Unit", тип, який має єдине значення, а саме - null. Після цього впровадження CLR може вирішити, що виклик функцій типу типу може оптимізувати його використання регістрів або стеків належним чином, знаючи, що нуль, який "повертається", може бути безпечно ігнорований.
У такому світі вам більше не потрібні окремі Func<A, R>
та Action<T>
делегати. Action<T>
просто Func<T, Unit>
.