Alasan / masalah mendasar adalah bahwa perancang spesifikasi CLS (yang mendefinisikan bagaimana bahasa berinteraksi dengan .net) tidak mendefinisikan sarana yang oleh anggota kelas dapat menentukan bahwa mereka harus dipanggil secara langsung, bukan melaluicallvirt , tanpa penelepon melakukan suatu cek referensi-nol; juga tidak memberikan banyak definisi struktur yang tidak akan dikenakan tinju "normal".
Jika spesifikasi CLS mendefinisikan cara seperti itu, maka akan mungkin bagi .net untuk secara konsisten mengikuti petunjuk yang ditetapkan oleh Common Object Model (COM), di mana referensi string nol dianggap secara semantik setara dengan string kosong, dan untuk lainnya tipe kelas yang tidak dapat diubah yang ditentukan pengguna yang seharusnya memiliki semantik nilai untuk juga mendefinisikan nilai default. Pada dasarnya, apa yang akan terjadi bagi masing-masing anggota String, misalnya Lengthditulis sebagai sesuatu seperti [InvokableOnNull()] int String Length { get { if (this==null) return 0; else return _Length;} }. Pendekatan ini akan menawarkan semantik yang sangat bagus untuk hal-hal yang harus berperilaku seperti nilai, tetapi karena masalah implementasi perlu disimpan di heap. Kesulitan terbesar dengan pendekatan ini adalah bahwa semantik konversi antara jenis danObject bisa menjadi sedikit keruh.
Suatu pendekatan alternatif akan memungkinkan definisi tipe struktur khusus yang tidak diwarisi dari Objecttetapi memiliki operasi tinju kustom dan unboxing (yang akan dikonversi ke / dari beberapa jenis kelas lainnya). Di bawah pendekatan seperti itu, akan ada tipe kelas NullableStringyang berperilaku sebagai string tidak sekarang, dan tipe struct kotak-kustom String, yang akan menampung bidang Valuetipe privat tunggal String. Mencoba mengonversikan Stringke NullableStringatau Objectakan kembali Valuejika bukan nol, atau String.Emptyjika nol. Mencoba melakukan cast String, referensi non-nol ke NullableStringinstance akan menyimpan referensi di Value(mungkin menyimpan null jika panjangnya nol); casting referensi lain akan menimbulkan pengecualian.
Meskipun string harus disimpan di heap, secara konseptual tidak ada alasan mengapa mereka tidak boleh berperilaku seperti tipe nilai yang memiliki nilai default non-nol. Memiliki mereka disimpan sebagai struktur "normal" yang memegang referensi akan lebih efisien untuk kode yang menggunakannya sebagai tipe "string", tetapi akan menambahkan lapisan tipuan dan inefisiensi tambahan saat casting ke "objek". Meskipun saya tidak melihat .net menambahkan salah satu dari fitur di atas pada akhir ini, mungkin desainer kerangka masa depan mungkin mempertimbangkan untuk memasukkannya.