2009-10-31 34 views
5

Đâ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 ...

Trả lời

5

Trong C#, biến của bạn không bao giờ bị thay đổi bởi callees mà bạn không chuyển chúng một cách rõ ràng dưới dạng tham chiếu (ví dụ: int.TryParse(s, out i) nơi bạn chỉ định rõ ràng từ khóa out). Tính năng này sẽ làm cho mọi thứ phức tạp bằng cách cho phép toán tử quá tải thay đổi nội dung của toán hạng mà không có sự cho phép rõ ràng của bạn.

Ví dụ,

public static MyStruct operator + (ref MyStruct left, ref MyStruct right) { 
    left = new MyStruct(); // !!!!!!!! 
    return something(left, right); 
} 

Khi bạn tham khảo một nhà điều hành như vậy trong C#:

MyStruct x = new MyStruct(); 
MyStruct y = new MyStruct(); 
MyStruct z = x + y; // in C#, you never expect `x` to be changed. 
+0

Không hề. Chỉ cần thực hiện quá tải toán tử để lấy tham số ref? –

+0

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'. –

+0

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 đó? –

1

Tôi nghĩ rằng đó là vì một nhà điều hành (trong giao diện toán học hơn là C# dường như mất) là một cách hợp lý một cái gì đó kết hợp các đối số của nó thành một giá trị mới, không bao giờ được phép đột biến bất cứ điều gì. C++ dường như xem xét các toán tử giống như một phiên bản của các phép toán tổng quát với cú pháp thuận tiện hơn các hàm, hơn là một cách để biểu diễn các toán học nói riêng. Tôi nghĩ rằng trong C# bạn hầu như không bao giờ nhìn thấy những thứ như định nghĩa các toán tử cho các hoạt động dòng và như vậy.

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