Loại 'chuỗi' phải là loại không thể rỗng để sử dụng nó làm tham số T trong loại chung hoặc phương thức 'System.Nullable <T>'


172

Tại sao tôi gặp Lỗi "Loại 'chuỗi' phải là loại giá trị không thể rỗng để sử dụng nó làm tham số 'T' trong loại chung hoặc phương thức '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; }
      }
    }
}

21
Stringđã là nullable.
M.Babcock

Câu trả lời:


204

Sử dụng stringthay vì string?ở tất cả các nơi trong mã của bạn.

Các Nullable<T>loại yêu cầu T là một loại giá trị không nullable, ví dụ inthay DateTime. Các loại tham chiếu như stringcó thể đã là null. Sẽ không có điểm nào trong việc cho phép những thứ như Nullable<string>vậy không được phép.

Ngoài ra nếu bạn đang sử dụng C # 3.0 trở lên, bạn có thể đơn giản hóa mã của mình bằng cách sử dụng các thuộc tính được triển khai tự động :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}

1
M.Babcock, khi tôi làm m_Word = null, nó có lỗi không, có đề xuất nào không? Tôi muốn có thể đặt Word thành null.
Khác Người dùng

1
@MisiverseUser: Bạn nhận được thông báo lỗi gì? Bạn có thể gửi tập tin chính xác mà bạn đã cố gắng biên dịch không? Thật khó để đoán lỗi của bạn là gì khi chỉ nhìn thấy một dòng mã của bạn. Ý tôi là có thể là bạn đang thiếu dấu chấm phẩy ... nhưng có lẽ bạn chỉ quên sao chép + dán nó ... Không có gì ngoài phỏng đoán cho đến khi bạn đăng mã bạn đã cố gắng biên dịch.
Mark Byers

Cảm ơn sự giúp đỡ, đã xem bài đăng này stackoverflow.com/questions/187406/ và có thể thấy rằng dấu hỏi chỉ dành cho các loại giá trị.
Khác Người dùng

@MisiverseUser: Đây không chỉ là "cho các loại giá trị". Nó đặc biệt phải là một loại giá trị không thể rỗng . Đúng như thông báo lỗi nói.
Mark Byers

1
Heh, sau khi lập trình Swift một thời gian, cái này có cái hay nhất của tôi trong một dự án C #.
Albert Bori

52

stringlà một loại tham chiếu, một lớp. Bạn chỉ có thể sử dụng Nullable<T>hoặc T?đường cú pháp C # với các loại giá trị không thể rỗng như intGuid.

Cụ thể, như stringlà một kiểu tham chiếu, một biểu thức kiểu stringcó thể là null:

string lookMaNoText = null;

15

System.String (với vốn S) đã là nullable, bạn không cần phải khai báo như vậy.

(string? myStr) sai.


Chỉnh sửa nhỏ cho câu trả lời của bạn, để làm nổi bật tầm quan trọng của chữ in hoa. Tôi chưa quen với C # và tôi đã mất bao giờ để có được sự khác biệt nhỏ này.
B - rian

4

Vì một lý do rất cụ thể, Nullable<int>hãy đặt con trỏ của bạn vào Nullable và nhấn F12 - Siêu dữ liệu cung cấp lý do (Lưu ý ràng buộc về cấu trúc):

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

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


4
Lưu ý mặc dù điều đó Nullable<Nullable<int>>không được phép mặc dù Nullable<int>là một cấu trúc.
Mark Byers

Nó thật thú vị. Đó có phải là "mã hóa cứng" vào trình biên dịch không? Làm thế nào nó bị ràng buộc từ một cấu trúc cụ thể (Nullable <Nullable <... >>)? - Chỉnh sửa Tôi thấy bây giờ rõ ràng nó rất đặc biệt - Lỗi biên dịch ... phải là loại giá trị không thể vô hiệu ....
Joshua Enfield

4

Xin lưu ý rằng trong phiên bản sắp tới của C # là 8, câu trả lời là không đúng.

All the reference types are non-nullable by default và bạn thực sự có thể làm như sau:

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

Tuy nhiên,

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

Điều quan trọng ở đây là thể hiện ý định của mã của bạn. Nếu "ý định" là loại tham chiếu có thể là null, thì hãy đánh dấu nó để nếu không việc gán giá trị null cho không nullable sẽ dẫn đến cảnh báo trình biên dịch.

Thêm thông tin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.