Trong khi điều này hợp lý nên hoạt động, thật không may là không. CLR vẫn thấy hàm tạo của bạn như là một hàm tạo dựa trên tham số.
Hãy nhớ rằng, trong khi C# hỗ trợ các tham số tùy chọn, điều này được thực hiện ở cấp trình biên dịch, tại thời gian biên dịch. Kiểu cơ bản vẫn chỉ chứa một hàm khởi tạo lấy một tham số duy nhất. Đối với CLR, "thông số mặc định" được chuyển đổi thành thuộc tính, như vậy:
public Widget(([Optional, DefaultParameterValue("foo")] string name) { // ...
CLR là thời gian chạy đa ngôn ngữ. Generics được tạo ra để làm việc ở mức CLR, cho tất cả các ngôn ngữ, vì vậy các ràng buộc phải đúng trong các ngôn ngữ không có các tham số mặc định. Ngôn ngữ không bắt buộc phải hiểu thuộc tính OptionalAttribute, cũng như DefaultParameterValueAttribute, do đó, điều này không thể làm việc thống nhất cho tất cả các ngôn ngữ, do đó nó không được phép.
Edit:
Đáp lại bình luận của bạn:
Những gì tôi không hiểu là tại sao các biên dịch C# không thể tạo mã cần thiết để đáp CLR
Về mặt lý thuyết, nhóm trình biên dịch C# có thể có ngôn ngữ tạo ra hai hàm tạo riêng biệt, thay vì một hàm tạo được đánh dấu bằng các thuộc tính. Điều này, có khả năng, phát nổ thành nhiều constructor, như các tham số được đặt tên tạo ra các khả năng cho nhiều, nhiều kết hợp có thể có của "constructors" (hoặc phương thức gọi cho phương thức), đặc biệt khi có nhiều đối số. Cá nhân tôi vui mừng vì họ không, vì nó sẽ gây nhầm lẫn do sự dư thừa của các phương thức và các nhà xây dựng trong các kiểu được tạo ra, điều này sẽ khiến API công cộng trông rất khác với mã đã tạo ra nó. Hãy constructor sau đây:
public Widget(
int id = 0,
string name = "foo",
float width=1.0f,
float height=1.0f,
float depth=1.0f
) { // ...
Were bạn tự động tạo ra tất cả các kết hợp có thể ở đây, trình biên dịch sẽ cần phải tạo ra thầu cho các nhà xây dựng đơn này, kể từ khi có N! những cách có thể để gọi cho điều này ...
Phân trang Eric Lippert .... Tôi nghĩ điều này sẽ giảm xuống các tham số tùy chọn là tính năng trình biên dịch, nhưng các ràng buộc chung là CLR. Vì vậy các tham số tùy chọn được thay thế bởi trình biên dịch và JIT chỉ nhìn thấy các tham số (requied). – Richard
@Richard: Đó là vấn đề cơ bản ở đây. Các tham số tùy chọn cũng có một số hiệu ứng phụ lạ đối với phiên bản, vì lý do chính xác này ... –