2013-09-03 35 views
5

Loại Nullable<T> được định nghĩa là struct. Trong. Net, bạn không thể chỉ định null cho một structstructs là các loại giá trị không thể được thể hiện bằng null (ngoại trừ Nullable<T>).Cách thức .Net Cho phép Nullables được đặt thành Null

int i = null; // won't compile - we all know this 
int? i = null; // will compile, and I'm glad it does, and it should compile, but why? 

Làm sao Nullable<T> trở thành một ngoại lệ đối với quy tắc "Bạn không thể gán null đến một loại giá trị?" Mã được biên dịch cho Nullable<T> không cung cấp thông tin chi tiết về cách điều này xảy ra.

+0

bản sao có thể có của [các kiểu nullable được triển khai như thế nào dưới mui xe trong .net?] (Http://stackoverflow.com/questions/2503811/how-are-nullable-types-implemented-under-the-hood-in -net) –

Trả lời

13

Làm cách nào để Nullable<T> trở thành ngoại lệ cho quy tắc "Bạn không thể gán giá trị rỗng cho loại giá trị?"

Bằng cách thay đổi ngôn ngữ, về cơ bản. Mã số null được lấy từ "tham chiếu null" thành "giá trị null của loại có liên quan".

Khi thực thi, "giá trị null" cho loại giá trị có thể đặt giá trị là giá trị trong đó thuộc tính HasValue trả về false. Vì vậy, đây:

int? x = null; 

tương đương với:

int? x = new int?(); 

Nó có giá trị tách khuôn khổ phần của Nullable<T> từ những khía cạnh ngôn ngữ và CLR. Thực tế, bản thân CLR không cần biết nhiều về các kiểu giá trị rỗng - theo như tôi biết, khía cạnh quan trọng duy nhất là giá trị null của một kiểu giá trị nullable được đóng vào một tham chiếu null, và bạn có thể unbox một tham chiếu null tới giá trị null của bất kỳ loại giá trị nullable nào. Ngay cả khi chỉ được giới thiệu ngay trước khi phát hành cuối cùng của .NET 2.0.

Sự hỗ trợ ngôn ngữ chủ yếu bao gồm:

  • đường cú pháp dưới hình thức ? nên int? tương đương với Nullable<int>
  • Lifted operators
  • Ý nghĩa thay đổi của null
  • Nhà điều hành null-coalescing (??) - không bị giới hạn đối với các loại giá trị không thể sử dụng
+3

@Dan: Nếu bạn muốn biết thêm chi tiết, tôi dành toàn bộ chương cho các loại giá trị có thể vô hiệu hóa trong C# trong chiều sâu :) –

+0

@JonSkeet Vì vậy, nó sẽ làm gì để làm cho 'int i = null;' tương đương với 'int i = new int(); '? – Dan

+0

Tôi giả sử thời gian chạy sẽ chỉ đặt thuộc tính 'HasValue' thành false khi chúng ta đặt' int i = null; 'Tôi có đúng không @Jon –

Các vấn đề liên quan