Đây có phải là hạn chế CLR hoặc quyết định thiết kế ngôn ngữ không? Tôi cố gắng để làm điều đó trong C++/CLI, tất nhiên nơi nó hoạt động vì sự cần thiết để hỗ trợ bản địa C++:Tại sao C# không hỗ trợ quá tải cho nhà điều hành bằng cách tham chiếu?
public ref class Test
{
public:
static Test^ operator &(Test^ msg, int& i)
{
i = i + 1;
return nullptr;
}
};
và sau đó nhìn vào trình biên dịch ra bỏ qua:
public: static Test __gc* op_BitwiseAnd(Test __gc* msg, Int32 __gc** modopt(IsImplicitlyDereferenced __gc*) i)
{
i[0] += 1;
return 0;
}
tôi đã đi xa hơn và cố gắng gọi toán tử này từ dự án C# - và tất nhiên tôi cần phải đi [an toàn] để làm điều đó (tôi cần con trỏ):
Test t = new Test();
int i = 0;
unsafe
{
t = t & &i;
}
Rõ ràng là không khó khăn như vậy để thực hiện cho CLR? Tôi thực sự bỏ lỡ bằng cách tham khảo trong các nhà khai thác quá tải và muốn ít nhất là trong ánh sáng bản thân mình tại sao điều này là mất tích?
Tại sao C# không thể giấu được sự xấu xa đằng sau các điểm không an toàn và con trỏ khi chúng ta cần xử lý các biến tham chiếu trong quá tải toán tử? Ngay cả khi tôi chọn đi với giải pháp xấu này, nó sẽ không hoạt động trong Silverlight, nơi các hoạt động không an toàn không được cho phép ...
Không hề. Chỉ cần thực hiện quá tải toán tử để lấy tham số ref? –
Ivan: thì bạn sẽ gọi nhà điều hành quá tải như thế nào? Nếu một phương thức nhận tham số 'ref', trang web cuộc gọi ** và ** trang định nghĩa nên ** tuyên bố rõ ràng tham số là' ref'. –
Mehrdad: Điều này hoàn toàn OK. Họ có chữ ký khác nhau, do đó, gọi điện thoại mà không cần ref sẽ không bao giờ phù hợp với một quá tải ref. Điều gì là quá phức tạp về điều đó, mà làm cho đội C# không thực hiện nó? Điều gì sẽ xảy ra nếu tôi thực sự cần thay đổi toán hạng không phải là kiểu tham chiếu - làm cách nào để thực hiện điều đó? –