Điều này có vẻ giống như một lỗi với tôi ...C# Thuộc tính tự động - Vẫn còn null sau + =?
Tôi chấp nhận rằng tính tự động, được xác định như vậy:
public decimal? Total { get; set; }
sẽ được null khi chúng được truy cập đầu tiên. Chúng chưa được khởi tạo, vì vậy tất nhiên chúng không có giá trị.
Nhưng, ngay cả sau khi đặt giá trị của chúng thông qua + =, số thập phân này? vẫn còn null. Vì vậy, sau:
Total += 8;
Tổng số vẫn không có giá trị. Làm thế nào điều này có thể chính xác? Tôi hiểu rằng nó đang làm một (null + 8), nhưng dường như lạ mà nó không nhận rằng nó có nghĩa là nó chỉ nên được đặt thành 8 ...
phụ lục:
tôi đã "null + 8 "điểm trong câu hỏi của tôi - nhưng lưu ý rằng nó hoạt động với chuỗi. Vì vậy, nó không null + "hello" tốt, và trả về "hello". Vì vậy, đằng sau hậu trường, nó đang khởi tạo chuỗi thành một đối tượng chuỗi với giá trị "hello". Hành vi phải giống nhau đối với các loại khác, IMO. Nó có thể là do một chuỗi có thể chấp nhận một giá trị rỗng như một giá trị, nhưng vẫn còn, một chuỗi rỗng không phải là một đối tượng được khởi tạo, đúng không?
Có lẽ nó chỉ vì một chuỗi không phải là một nullable ...
"Chúng chưa được khởi tạo, vì vậy tất nhiên chúng không có giá trị." Đây là mấu chốt của sự nhầm lẫn của bạn. Các thuộc tính được tự động gán ban đầu, trong trường hợp này, là null. Bạn đang lý luận từ một sai lầm: rằng tài sản là chưa được giao. * Thuộc tính ban đầu được gán * Không có bất kỳ thứ gì như "thuộc tính chưa được gán" trong C#. –
Sự khác biệt thú vị. Cũng thú vị là bạn có thể tìm thấy hàng ngàn ví dụ về những người đề cập đến các giá trị "được khởi tạo thành null" là "chưa được khởi tạo". Vì vậy, có lẽ đó là một quan niệm sai lầm phổ biến. Một điều tôi tò mò - nếu chúng ta có vấn đề này, nơi chúng ta không muốn tạo ra "null + 8 = 8" hoặc "null && true == true", tại sao nó lại không bị loại trừ khi các kiểu này của mọi thứ được thực hiện? Dường như điều đó có thể có thể ngăn chặn một số khó khăn để gỡ lỗi. –