C # kesalahan string nullable


136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

Nanti di kode saya gunakan seperti ini:

typeOfContract = Request.QueryString["type"];

Saya mendapatkan kesalahan berikut pada deklarasi typeOfContractbaris yang menyatakan:

Jenis 'string' harus berupa jenis nilai yang tidak dapat dinolkan untuk menggunakannya sebagai parameter 'T' dalam jenis umum atau metode 'System.Nullable <T>'

Ada ide? Pada dasarnya, saya ingin memastikan bahwa "type"ada QueryStringsebelum melakukan tindakan.

Jawaban:


304

System.String adalah tipe referensi dan sudah "nullable".

Nullable <T> dan? sufiks adalah untuk tipe nilai seperti Int32, Double, DateTime, dll.


13
Satu hal yang perlu diperhatikan: Nullable <T> adalah tipe nilai itu sendiri, tetapi batasan tipe generik "struct" hanya menyertakan tipe nilai non-nullable - jadi Anda tidak bisa melakukan Nullable <Nullable <int>>.
Jon Skeet

Dalam C # 8.0 tipe referensi dapat ditandai sebagai nullable. Seseorang mungkin mengetik string?untuk memberi tahu dunia bahwa string ini mungkin nol. Ref: youtube.com/watch?v=VdC0aoa7ung
nkalfov

39

Anda membuatnya menjadi rumit. stringsudah nihil. Anda tidak perlu membuatnya lebih null. Hapus ?di tipe properti.


19

string tidak bisa menjadi parameter untuk Nullable karena string bukan tipe nilai. String adalah tipe referensi.

string s = null; 

adalah pernyataan yang sangat valid dan tidak perlu menjadikannya nullable.

private string typeOfContract
    {
      get { return ViewState["typeOfContract"] as string; }
      set { ViewState["typeOfContract"] = value; }
    }

harus bekerja karena sebagai kata kunci.


13

String adalah tipe referensi, jadi Anda tidak perlu (dan tidak bisa) menggunakan di Nullable<T>sini. Cukup deklarasikan typeOfContract sebagai string dan cukup periksa null setelah mendapatkannya dari string kueri. Atau gunakan String.IsNullOrEmpty jika Anda ingin menangani nilai string kosong sama seperti null.



1

Harap dicatat bahwa dalam versi C # yang akan datang yaitu 8, jawabannya tidak benar.

All the reference types are non-nullable by default dan Anda sebenarnya dapat melakukan hal berikut:

public string? MyNullableString; 
this.MyNullableString = null; //Valid

Namun,

public string MyNonNullableString; 
this.MyNonNullableString = null; //Not Valid and you'll receive compiler warning. 

Yang penting di sini adalah menunjukkan maksud kode Anda. Jika "maksud" adalah bahwa jenis referensi bisa jadi null, maka tandai sehingga jika tidak menetapkan nilai null ke non-nullable akan menghasilkan peringatan compiler.

Info lebih lanjut

Kepada moderator yang menghapus semua jawaban, jangan lakukan itu. Saya sangat yakin jawaban ini menambah nilai dan menghapus hanya akan membuat seseorang tidak mengetahui apa yang benar pada saat itu. Karena Anda telah menghapus semua jawaban, saya memposting ulang jawaban di sini. Tautan yang dikirimkan tentang "duplikat" hanyalah pembukaan dari beberapa orang dan menurut saya itu bukan rekomendasi resmi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.