nieważne jako typ . Dlaczego, u licha, „pustka” jest typem? Nie ma instancji, nie ma wartości, nie można go używać jako argumentu typu ogólnego, typu parametru formalnego, typu lokalnego, typu pola lub typu właściwości. Nie ma znaczenia jako typ; jest raczej faktem na temat wpływu wywołania metody na stos maszyny wirtualnej. Ale maszyna wirtualna to po prostu: maszyna wirtualna. Prawdziwa maszyna umieści zwracaną wartość w rejestrze (zazwyczaj EAX na x86) i nie wpłynie w ogóle na stos! Pustka jako typ to po prostu zły pomysł dookoła.
Gorzej: gdy jest używany jako typ wskaźnika, ponieważ w void*
nim oznacza coś zupełnie innego niż to, co oznacza, gdy jest używany jako typ zwracany. Teraz oznacza „wskaźnik do miejsca przechowywania nieznanego typu”, co nie ma nic wspólnego z jego znaczeniem jako „metoda, która nie zwraca żadnej wartości”.
Możemy wymienić void*
jako typ wskaźnika na IntPtr
. (I void**
z IntPtr*
i tak dalej.) Możemy zastąpić void jako typ zwracany przez „Unit”, typ, który ma jedną wartość, a mianowicie null. Implementacja CLR mogłaby następnie zdecydować, że wywołanie funkcji typowanej dla jednostki może odpowiednio zoptymalizować wykorzystanie rejestrów lub stosów, wiedząc, że zwracane wartości null można bezpiecznie zignorować.
W takim świecie nie potrzebujesz już oddzielnych Func<A, R>
i Action<T>
delegatów. Action<T>
jest po prostu Func<T, Unit>
.