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.

Mike Fielden
sumber

Jawaban:

304

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

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

Joe
sumber
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.

jop
sumber
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.

Szymon Rozga
sumber
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.

csgero
sumber
4

Untuk nullable, gunakan ?dengan semua primitif C # , kecuali string.

Halaman berikut memberikan daftar C # primitif : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx

James Oravec
sumber
1
Tautan Rusak Terima kasih
Mina Gabriel
Terima kasih Mina, saya menemukan tautan berbeda dan memperbarui referensi.
James Oravec
1
Tidak hanya primitif, semua jenis nilai non-nullable (yang tidak ditangani secara khusus oleh .NET) berfungsi.
IllidanS4 mendukung Monica
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.

ANewGuyInTown
sumber