2015-06-24 14 views
7

Giả sử chúng ta đã mã sau:Tại sao C# 6.0 không cho phép thiết lập các thuộc tính của một cấu trúc không null null khi sử dụng toán tử tuyên truyền Null?

struct Article 
{ 
    public string Prop1 { get; set; } 
} 

Article? art = new Article(); 
art?.Prop1 = "Hi"; // compile-error 

Các lỗi biên dịch là

CS0131 Phía bên tay trái của một bài tập phải là một biến, tài sản hoặc indexer.

Thực tế art?.Prop1 là tài sản và nên được coi là bài tập hợp lệ!
Tôi không thấy bất kỳ vấn đề nào với nhiệm vụ để làm cho mã này không hợp lệ.

Tại sao C# 6.0 không cho phép đặt thuộc tính của cấu trúc không null null?
Bất kỳ đề xuất thay thế nào cho một mã dòng để thực hiện chuyển nhượng hợp lệ sẽ được đánh giá cao.

+0

Remove dấu hỏi trong dòng của bạn 'art? .Prop1 =" Hi ";' và nhiệm vụ của bạn không nên ném một lỗi. Làm cho nó 'art.Prop1 =" Hi ";' –

+0

@ K.AlanBates Ông đặc biệt muốn sử dụng toán tử truyền bá null. – Servy

+0

Structs có trong C# chỉ để làm cho bạn cuộc sống thú vị. Hãy thử 'Danh sách

bài viết = danh sách mới
{Điều mới()}; article [0] .Prop1 = "test"; '- có thể bạn sẽ xem xét lại việc sử dụng các cấu trúc tại điểm đó :). –

Trả lời

16

Mã này:

Article? art 

sẽ xác định một Nullable<Article> nhưng sau đó khi bạn làm:

art?.Prop1 = "Hi"; 

này sẽ có nghĩa là sử dụng Null tuyên truyền/nhà điều hành có điều kiện.

Điều khiển tuyên truyền/điều kiện không có điều kiện là để truy cập các thuộc tính, không đặt chúng. Do đó bạn không thể sử dụng nó.

Khi @Servy cho biết trong phần nhận xét, kết quả của toán tử điều kiện Null luôn là giá trị và bạn không thể chỉ định giá trị cho giá trị, do đó lỗi.

Nếu bạn chỉ cố gắng để thiết lập thuộc tính sau đó bạn không cần ? với tên đối tượng, ? với Nullable<T> loại được sử dụng tại thời điểm kê khai, đó là đường cú pháp để:

Nullable<Article> art; //same as Article? art 
+3

Hoặc để nói điều tương tự về kỹ thuật, kết quả của toán tử tuyên truyền null luôn là giá trị, không bao giờ là biến, đó là lý do tại sao anh ta nhận được lỗi nói rằng anh ta không thể gán giá trị cho một giá trị, vì nó không phải là biến. – Servy

+3

Câu hỏi vẫn còn lý do tại sao nó không được phép. Trình biên dịch có thể nhận thấy rằng đó là một nhiệm vụ và sau đó sử dụng toán tử tuyên truyền null để trả về biến/thuộc tính thay vì giá trị hoặc tôi đã bỏ qua một cái gì đó? Có thể được sử dụng để đơn giản hóa mã bằng cách bỏ qua kiểm tra null trước khi thực hiện một nhiệm vụ. –

+1

Vì bạn đã có thể gọi một phương thức như x? .SetValue (...), gán thuộc tính (điều tương tự) nên là một tùy chọn hợp lệ. Tại sao không? – Vlad

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