Câu hỏi có phần khó hiểu, vì câu hỏi không liên quan gì đến LINQ, không có gì liên quan đến phương sai chung và có bộ khởi tạo bộ sưu tập cũng như bộ khởi tạo đối tượng. Câu hỏi thực sự là, theo như tôi có thể nói "tại sao việc sử dụng bộ khởi tạo bộ sưu tập ngoài biểu thức tạo đối tượng không hợp pháp?"
Nguyên tắc thiết kế có liên quan ở đây là nói chung, chúng tôi muốn hoạt động tạo và khởi tạo các đối tượng để có từ "mới" trong chúng ở đâu đó như một tín hiệu cho người đọc rằng có một sự sáng tạo đối tượng đang diễn ra ở đây. (Có, có một vài ngoại lệ đối với quy tắc này trong C#. Như một bài tập cho người đọc, hãy xem bạn có thể đặt tên cho tất cả họ không.)
Làm mọi thứ theo cách của bạn gây khó khăn hơn cho mã. Nhanh, cái này làm gì?
d = new List<int>() { 10, 20, 30 };
d = { 40, 50, 60 };
Liệu dòng thứ hai thêm 40, 50, 60 vào danh sách hiện hành?Hay nó thay thế danh sách cũ bằng một danh sách mới? Không có "mới" trong đó, do đó, người đọc có một kỳ vọng rằng một đối tượng mới đã được tạo ra?
Khi bạn nói
q = new Whatever() { MyList = { 40, 50, 60 } };
mà không tạo ra một danh sách mới; nó gắn thêm 40, 50, 60 vào một danh sách hiện có được chỉ định bởi hàm tạo. Cú pháp được đề xuất của bạn do đó không rõ ràng và khó hiểu về việc liệu danh sách mới có được tạo hay không.
Tính năng được đề xuất vừa khó hiểu vừa không cần thiết, do đó không thể triển khai tính năng này sớm.
Nguồn
2011-01-23 16:38:36
câu hỏi thú vị. –
Tôi nghĩ rằng thực tế là lỗi trình biên dịch là "biểu hiện dự kiến" là một đầu mối lớn. Trong ví dụ thứ hai, cú pháp không biểu thị một biểu thức như bạn thường mong đợi, tức là không có toán tử 'new' nào. Tôi nghi ngờ rằng ví dụ đầu tiên hoạt động như nó là một trường hợp đặc biệt và trình biên dịch là thoải mái hơn về những gì tạo thành một biểu thức cú pháp. Lợi ích của các quy tắc thoải mái là cú pháp terser rất mong muốn đối với ngữ cảnh của cú pháp khởi tạo đối tượng, nó sẽ xem xét cách khác. –