Lỗi chuỗi C # nullable


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

Sau này trong mã tôi sử dụng nó như thế này:

typeOfContract = Request.QueryString["type"];

Tôi nhận được lỗi sau khi khai báo typeOfContractdòng:

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 <T>'

Có ý kiến ​​gì không? Về cơ bản, tôi muốn đảm bảo rằng "type"tồn tại trong QueryStringtrước khi thực hiện một hành động.

Câu trả lời:


304

System.String là một loại tham chiếu và đã "nullable".

Không thể <T> và? hậu tố dành cho các loại giá trị như Int32, Double, DateTime, v.v.


13
Một điều cần lưu ý: Nullable <T> là một loại giá trị, nhưng ràng buộc loại chung "struct" chỉ bao gồm các loại giá trị không thể rỗng - vì vậy bạn không thể thực hiện Nullable <Nullable <int >>.
Jon Skeet

Trong các loại tham chiếu C # 8.0 có thể được đánh dấu là nullable. Người ta có thể gõ string?để nói với thế giới chuỗi này có thể là null. Tham chiếu: youtube.com/watch?v=VdC0aoa7ung
nkalfov

39

Bạn đang làm cho nó phức tạp. stringđã là nullable. Bạn không cần phải làm cho nó trở nên vô giá trị hơn . Đưa ra các ?loại tài sản.


19

chuỗi không thể là tham số cho Nullable vì chuỗi không phải là loại giá trị. Chuỗi là một loại tham chiếu.

string s = null; 

là một tuyên bố rất hợp lệ và không cần phải làm cho nó thành nullable.

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

nên làm việc vì từ khóa như .


13

Chuỗi là một loại tham chiếu, vì vậy bạn không cần (và không thể) sử dụng Nullable<T>ở đây. Chỉ cần khai báo typeOfContract dưới dạng chuỗi và chỉ cần kiểm tra null sau khi lấy nó từ chuỗi truy vấn. Hoặc sử dụng String.IsNullOrEmpty nếu bạn muốn xử lý các giá trị chuỗi trống giống như null.


4

Đối với nullable, sử dụng ?với tất cả các nguyên hàm C # , ngoại trừ chuỗi.

Trang sau đây cung cấp danh sách các nguyên thủy C # : http://msdn.microsoft.com/en-us/l Library / aa711900 (v = vs.71) .aspx


1
Liên kết bị hỏng Cảm ơn
Mina Gabriel

Cảm ơn Mina, tôi đã tìm thấy một liên kết khác và cập nhật tài liệu tham khảo.
James Oravec

1
Không chỉ nguyên thủy, tất cả các loại giá trị không thể rỗng (không được xử lý đặc biệt bởi .NET) đều hoạt động.
IllidanS4 muốn Monica trở lại vào

0

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

Đối với người điều hành đang xóa tất cả các câu trả lời, đừng làm điều đó. Tôi tin tưởng mạnh mẽ câu trả lời này làm tăng giá trị và việc xóa sẽ đơn giản khiến ai đó không biết điều gì là đúng vào thời điểm đó. Vì bạn đã xóa tất cả các câu trả lời, tôi sẽ đăng lại câu trả lời ở đây. Liên kết được gửi liên quan đến "trùng lặp" chỉ đơn giản là mở một số người và tôi không nghĩ đó là khuyến nghị chính thức.

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.