2011-09-14 11 views

Trả lời

35

List<T> đã là một loại tài liệu tham khảo (đối với bất kỳ loại T) - bạn chỉ có thể tuyên bố Nullable<T> nơi T là một loại giá trị không nullable (nó khai báo là Nullable<T> where T : struct).

Nhưng đó là ổn, bởi vì nếu bạn chỉ cần khai báo:

private List<IpAddressRange> ipAddressRangeToBind; 

sau đó bạn vẫn có thể có

ipAddressRangeToBind = null; 

vì các loại tài liệu tham khảo là luôn nullable.

+0

câu trả lời !!!, cảm ơn ..... để giải thích dễ dàng – Ajay2707

9

List<IpAddressRange> là loại tham chiếu - nó đã bị vô hiệu - trong thực tế, nó sẽ được khởi tạo bằng không bởi khai báo đó.

5

Bạn chỉ có thể sử dụng nó như là:

List<IpAddressRange> ipAddressRangeToBind = null; 

Danh sách đã nullable.

+0

đúng sự thật, tại sao tôi không thể làm điều đó mặc dù không quan tâm ...? – Exitos

+2

Tôi đoán vì như Jon Skeet giải thích, các ràng buộc 'Nullable trong đó T: struct' và' IpAddressRange' không phải là 'struct'. Tại sao ràng buộc bạn hỏi?Đó là một câu hỏi khác nhau :) –

+0

@ Pete2k: Tôi đã thêm một câu trả lời là tại sao không tồn tại ràng buộc. Nó không phải là câu trả lời đầu tiên, vì vậy tôi không muốn yêu cầu bồi thường tín dụng cho câu trả lời, nhưng nó đã quá dài để chỉ cần đưa vào một bình luận ... –

4

Loại tham chiếu không được bao bọc trong Nullable<T> do ràng buộc where T : struct đối với chung.

Lý do ràng buộc này là:

  1. loại Reference đã nullable theo định nghĩa, và
  2. Nullable không phải là rất không gian hiệu quả, nhưng nhiều hơn một nullability "logic".

Nullable<T> có một tài sản bool HasValue và một loại tài sản TValue chứa giá trị giá trị kiểu thực tế.

Thậm chí nếu HasValue == false (nghĩa là, nếu biến được bọc rỗng được đặt thành null), thì bạn sẽ chiếm không gian cho loại giá trị như thể nó ở đó.

Đó là một cách hợp lý không thể cho phép bạn chỉ định hành vi tùy chọn nhưng không tiết kiệm được dung lượng. Điều này rất giống với cách tăng :: tùy chọn hoạt động trong C++.

+0

Tôi thấy bây giờ mệnh đề Where is now! – Exitos

+0

Rất nhiều phiền toái với 'Nullable ' xuất phát từ mong muốn có nó giả vờ rằng một cá thể rỗng là 'null'. Một quyết định không may, IMHO, vì nó ngăn chặn các phương thức như 'TryGetValue', có thể có hoặc không có' T' để trả về, chỉ đơn giản là trả về một 'TValue? 'Mà không phải lo lắng về kiểu' TValue' (nếu 'HasValue' của mục trả về là false, khoá không tồn tại, nếu' HasValue' là true, khóa tồn tại ngay cả khi 'Value' được lưu trữ xảy ra là' null'). Mặt khác, trong khi các kiểu nullable nên hợp lý là covariant với tham số kiểu của chúng ... – supercat

+0

... (vì bất kỳ 'Animal?' Sẽ có thể giữ nội dung của bất kỳ 'Cat?'), Làm cho công việc hiệp phương sai trong khi có một diễn viên từ 'Động vật?' hoặc 'Động vật ??' vào 'Đối tượng' giữ nguyên mức độ vô hiệu, sẽ yêu cầu chuyển đổi từ một loại nullable thành' Object' không sử dụng quyền anh bình thường. Theo các quy tắc boxing bình thường, các kiểu giá trị đóng hộp là * luôn luôn * có thể thay đổi (ngay cả khi loại giá trị cơ bản được cho là "không thay đổi"). Quá tệ, vì thiết kế như vậy làm tăng độ khó của việc tạo ra những thứ như một biến thể giao diện "từ điển có thể đọc được" đối với các loại giá trị được lưu trữ trong đó. – supercat