Tipe 'string' harus merupakan tipe yang tidak dapat dibatalkan untuk menggunakannya sebagai parameter T dalam tipe umum atau metode 'System.Nullable <T>'

172

Mengapa saya mendapatkan Kesalahan "Tipe 'string' harus merupakan tipe nilai yang tidak dapat dibatalkan untuk menggunakannya sebagai parameter 'T' dalam tipe umum atau metode 'System.Nullable'"?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Universe;

namespace Universe
{
    public class clsdictionary
    {
      private string? m_Word = "";
      private string? m_Meaning = "";

      string? Word { 
          get { return m_Word; }
          set { m_Word = value; }
      }

      string? Meaning { 
          get { return m_Meaning; }
          set { m_Meaning = value; }
      }
    }
}
Pengguna Lain-Lain
sumber
21
Stringsudah nullable.
M.Babcock

Jawaban:

204

Gunakan stringalih-alih string?di semua tempat dalam kode Anda.

The Nullable<T>jenis mensyaratkan bahwa T adalah jenis nilai non-nullable, misalnya intatau DateTime. Jenis referensi seperti stringsudah bisa nol. Tidak akan ada gunanya membiarkan hal-hal seperti Nullable<string>itu dilarang.

Juga jika Anda menggunakan C # 3.0 atau yang lebih baru, Anda dapat menyederhanakan kode Anda dengan menggunakan properti yang diimplementasikan secara otomatis :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}
Mark Byers
sumber
1
M.Babcock, ketika saya melakukan m_Word = null, itu kesalahan, ada saran? Saya ingin dapat mengatur Word menjadi nol.
MiscellaneousUser
1
@MiscellaneousUser: Pesan kesalahan apa yang Anda dapatkan? Bisakah Anda memposting file persis yang Anda coba kompilasi? Sulit menebak kesalahan Anda karena hanya melihat satu baris kode Anda. Maksud saya bisa jadi Anda kehilangan titik koma ... tapi mungkin Anda hanya lupa menyalin + menempelnya ... Tidak lain hanyalah menebak sampai Anda memposting kode yang Anda coba kompilasi.
Mark Byers
Terima kasih atas bantuannya, lihat posting ini stackoverflow.com/questions/187406/… dan dapat melihat bahwa tanda tanya hanya untuk tipe nilai.
MiscellaneousUser
@MiscellaneousUser: Ini bukan hanya "untuk tipe nilai". Itu harus secara spesifik menjadi tipe nilai yang tidak dapat dibatalkan . Seperti yang dikatakan pesan kesalahan.
Mark Byers
1
Heh, setelah pemrograman Swift untuk sementara waktu, yang ini mendapatkan yang terbaik dari saya pada proyek C #.
Albert Bori
52

stringadalah tipe referensi, kelas. Anda hanya dapat menggunakan Nullable<T>atau T?gula sintaksis C # dengan tipe nilai yang tidak dapat dibatalkan seperti intdan Guid.

Secara khusus, seperti stringtipe referensi, ekspresi tipe stringsudah bisa null:

string lookMaNoText = null;
Jon Skeet
sumber
15

System.String (dengan huruf kapital S) sudah dapat dibatalkan, Anda tidak perlu menyatakannya demikian.

(string? myStr) salah.

Chagbert
sumber
Edit kecil untuk jawaban Anda, untuk menyoroti pentingnya huruf kapital. Saya baru mengenal C # dan saya butuh selamanya untuk mendapatkan perbedaan kecil ini.
B - rian
4

Untuk alasan yang sangat spesifik, ketik Nullable<int>letakkan kursor Anda di Nullable dan tekan F12 - Metadata memberikan alasannya (Perhatikan kendala struct):

public struct Nullable<T> where T : struct
{
...
}

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

Joshua Enfield
sumber
4
Perhatikan bahwa Nullable<Nullable<int>>itu dilarang meskipun Nullable<int>adalah sebuah struct.
Mark Byers
Itu menarik. Apakah itu "hard-coded" ke dalam kompiler? Bagaimana itu dibatasi dari struct tertentu (Nullable <Nullable <... >>)? - Sunting Saya melihat sekarang tampaknya ini istimewa - Kompilasi Kesalahan ... harus merupakan tipe nilai yang tidak dapat dibatalkan ....
Joshua Enfield
4

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 benar-benar 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 "niat" adalah bahwa tipe referensi bisa nol, maka tandai jadi jika menetapkan nilai nol ke non-nullable akan menghasilkan peringatan kompiler.

Info lebih lanjut

ANewGuyInTown
sumber