Masalah mendasar dengan "void" adalah bahwa itu tidak berarti hal yang sama dengan tipe pengembalian lainnya. "void" berarti "jika metode ini kembali maka tidak ada nilai sama sekali." Bukan nol; null adalah sebuah nilai. Sama sekali tidak mengembalikan nilai.
Ini benar-benar mengacaukan sistem tipe. Sistem tipe pada dasarnya adalah sistem untuk membuat deduksi logis tentang operasi apa yang valid pada nilai-nilai tertentu; metode pengembalian batal tidak mengembalikan nilai, jadi pertanyaan "operasi apa yang valid untuk hal ini?" sama sekali tidak masuk akal. Tidak ada "hal" untuk dioperasi, valid atau tidak valid.
Selain itu, ini mengacaukan sesuatu runtime sengit. .NET runtime adalah implementasi dari Sistem Eksekusi Virtual, yang ditentukan sebagai mesin stack. Yaitu, mesin virtual di mana operasi semua ditandai dalam hal efeknya pada tumpukan evaluasi. (Tentu saja dalam praktiknya mesin akan diimplementasikan pada mesin dengan tumpukan dan register, tetapi sistem eksekusi virtual mengasumsikan hanya tumpukan.) Efek panggilan ke metode batal pada dasarnyaberbeda dari efek panggilan ke metode non-void; metode non-void selalu menempatkan sesuatu pada stack, yang mungkin perlu dihapus. Metode batal tidak pernah menempatkan sesuatu di tumpukan. Dan karenanya kompiler tidak dapat memperlakukan metode void dan non-void sama dalam kasus di mana nilai yang dikembalikan metode diabaikan; jika metode ini batal maka tidak ada nilai balik sehingga tidak boleh ada pop.
Untuk semua alasan ini, "void" bukan tipe yang bisa dipakai; tidak memiliki nilai , itulah intinya. Ini tidak dapat dikonversi ke objek, dan metode pengembalian batal tidak pernah dapat diperlakukan secara polimorfik dengan metode non-batal-kembali karena melakukan hal itu merusak tumpukan!
Dengan demikian, void tidak dapat digunakan sebagai argumen tipe, yang memalukan, seperti yang Anda catat. Akan sangat nyaman.
Dengan manfaat melihat ke belakang, akan lebih baik bagi semua pihak yang peduli jika alih-alih tidak melakukan apa pun, metode pengembalian yang kosong secara otomatis mengembalikan "Unit", tipe referensi tunggal ajaib. Anda kemudian akan tahu bahwa setiap pemanggilan metode meletakkan sesuatu di tumpukan , Anda akan tahu bahwa setiap pemanggilan metode mengembalikan sesuatu yang dapat ditugaskan ke variabel tipe objek , dan tentu saja Unit dapat digunakan sebagai argumen tipe , sehingga akan ada tidak perlu memiliki tipe delegasi Aksi dan Fungsi yang terpisah. Sayangnya, itu bukan dunia tempat kita berada.
Untuk beberapa pemikiran lain dalam nada ini, lihat: