mục đích/điểm/lý do cho phép sử dụng phần tử ngôn ngữ C# không có biểu diễn thời gian chạy trong CLR như nhóm phương pháp bên trong toán tử "thời gian chạy" như thế nào?
Lưu trữ ghi chú thiết kế ngôn ngữ không đề cập đến lý do quyết định này được đưa ra, do đó, bất kỳ phỏng đoán nào cũng sẽ là phỏng đoán. Họ đề cập rằng nếu kết quả của "là" có thể được xác định tĩnh để luôn luôn đúng hoặc sai, rằng nó được xác định như vậy và đưa ra một cảnh báo. Có vẻ hợp lý rằng điều này có thể đơn giản là một lỗi.
Lý do phổ biến nhất để chuyển những gì có thể đúng là lỗi thành cảnh báo (hoặc đơn giản là cho phép) là do giảm gánh nặng khi nhà sản xuất chương trình tự động tạo mã. Tuy nhiên, tôi không thấy một kịch bản thực sự hấp dẫn ở đây.
CẬP NHẬT:
Tôi vừa kiểm tra đặc tả C# 1.0. Nó không có ngôn ngữ này. Nó không nói bất cứ điều gì về null hoặc đối số nhóm phương thức. Và tất nhiên nó không nói gì về chuyển đổi nhóm phương pháp bởi vì trong C# 1.0 không có chuyển đổi nhóm phương pháp ngầm; bạn phải gọi một cách rõ ràng "new D (M)" nếu bạn muốn chuyển đổi phương thức M thành delegate type D.
Điểm sau này là lý do cho "M là D" trả về false thay vì đúng; Bạn không thể nói một cách hợp pháp "D d = M;" vậy tại sao "M là D" là đúng?
Tất nhiên trong C# 2.0 điều này có ý nghĩa ít hơn, vì bạn có thể nói "D d = M;" trong C# 2.0.
Tôi cũng chỉ hỏi một trong những người có mặt khi toán tử "is" được thiết kế và anh ta không có ký ức nào về việc quyết định câu hỏi này theo cách này hay cách khác. Nghi ngờ của ông là thiết kế ban đầu của toán tử "is" không đưa ra bất kỳ lỗi nào, chỉ cảnh báo, và tất cả văn bản trong đặc tả về việc phải làm gì với các nhóm phương thức và null và không được thêm vào sau, cho Phiên bản C# 2.0 của spec, và dựa trên những gì trình biên dịch thực sự đã làm.
Tóm lại, có vẻ như đây là một lỗ thiết kế trong C# 1.0 đã được ghi lại khi thông số được cập nhật cho C# 2.0. Nó không giống như hành vi cụ thể này đã được mong muốn và cố tình thực hiện.
Lý thuyết này được củng cố bởi thực tế là các phương thức ẩn danh do tạo ra lỗi khi được sử dụng làm đối số cho "là" trong C# 2.0. Nó sẽ không phải là một thay đổi phá vỡ để làm như vậy, nhưng nó sẽ là một thay đổi phá vỡ để làm cho "M là D" đột nhiên bắt đầu trở lại đúng hoặc là một lỗi.
THÔNG TIN THÊM:
Trong khi điều tra điều này, tôi đã học được điều gì đó thú vị. (Đối với tôi.) Khi tính năng được thiết kế ban đầu, thiết kế cho phép hoặc là tên của một loại, hoặc đối tượng Kiểu làm đối số bên phải cho "là". Ý tưởng đó đã bị bỏ rơi trước khi C# 1.0 được vận chuyển.
+1 _no đầu mối _... – SLaks
Đó là ... cảnh quan tuyệt đẹp. Phần trên toán tử 'as' không đề cập đến các nhóm phương thức. –
@Tim: Nhưng toán tử "as" được định nghĩa là đường cú pháp cho kết hợp các phôi, toán tử điều kiện và toán tử "is", vì vậy toán tử "as" không cần phải đề cập đến các nhóm phương thức. –