batal sebagai tipe . Mengapa "void" adalah tipe? Tidak memiliki instance, tidak memiliki nilai, Anda tidak dapat menggunakannya sebagai argumen tipe generik, tipe parameter formal, tipe lokal, tipe bidang, atau tipe properti. Itu tidak memiliki arti sebagai tipe; melainkan, ini adalah fakta tentang apa efek pemanggilan metode terhadap tumpukan mesin virtual. Tapi mesin virtual itu hanya itu: mesin virtual. Mesin nyata akan memasukkan nilai yang dikembalikan ke register (biasanya EAX pada x86) dan tidak mempengaruhi tumpukan sama sekali! Batal sebagai tipe hanya ide buruk di sekitar.
Lebih buruk: ketika digunakan dalam jenis pointer seperti di void*
dalamnya berarti sesuatu yang sama sekali berbeda dari apa artinya ketika digunakan sebagai tipe pengembalian. Sekarang ini berarti "penunjuk ke lokasi penyimpanan dengan tipe yang tidak dikenal", yang tidak ada hubungannya dengan artinya sebagai "metode yang tidak mengembalikan nilai apa pun."
Kita dapat mengganti void*
dengan tipe pointer dengan IntPtr
. (Dan void**
dengan IntPtr*
dan seterusnya.) Kita dapat mengganti void sebagai tipe kembali dengan "Unit", tipe yang memiliki nilai tunggal, yaitu, null. Implementasi CLR kemudian dapat memutuskan bahwa panggilan fungsi unit-typed dapat mengoptimalkan penggunaan register atau tumpukan dengan tepat, mengetahui bahwa null yang sedang "dikembalikan" dapat diabaikan dengan aman.
Di dunia seperti itu Anda tidak perlu lagi terpisah Func<A, R>
dan Action<T>
mendelegasikan. Action<T>
hanya Func<T, Unit>
.