2009-07-15 47 views
7

Tôi đã viết một phương thức mở rộng cho Chuỗi để lấy đối số char, string.Remove(char). Nhưng khi tôi sử dụng nó, nó được gọi là phương thức mặc định là string.Remove(int).Độ phân giải phương pháp mở rộng

Không phải sự hiện diện của phương pháp thực tế có mức độ ưu tiên cao hơn chuyển đổi ngầm không?

Trả lời

9

Phương pháp thể hiện có ưu tiên hơn các phương pháp mở rộng. Quan sát của bạn là bằng chứng giống nhau.

Khi giải quyết phương thức cần gọi, phương thức này sẽ luôn chọn phương thức đối sánh phù hợp theo phương pháp tiện ích ... trực quan theo cách.

diễn giải từ C# trong chiều sâu,

Khi trình biên dịch thấy rằng bạn đang cố gắng để gọi một phương thức mà trông như một phương pháp dụ nhưng không thể để tìm một, nó sau đó tìm kiếm phương pháp mở rộng (có thể nhìn thấy dựa trên chỉ thị using của bạn). Trong trường hợp nhiều thí sinh như các phương pháp khuyến nông mục tiêu, một với "chuyển đổi tốt hơn" tương tự như quá tải (ví dụ nếu IChild và Ibase cả hai đều có một phương pháp mở rộng tương tự định nghĩa .. IChild.ExtensionMethod là chọn)

Ngoài ra, trình ngắt mã ẩn có thể cho phép nói TypeA không có SecretMethod làm phương thức thể hiện trong Libv1.0. Vì vậy, bạn viết một phương pháp mở rộng SecretMethod. Nếu tác giả giới thiệu một phương thức thể hiện cùng tên và chữ ký trong v2.0 (có thông số this), và bạn biên dịch lại nguồn của bạn bằng Libv2.0, tất cả các cuộc gọi hiện có đến phương thức mở rộng sẽ âm thầm bây giờ được chuyển đến phương thức thể hiện mới.

+0

Có nhưng ít nhất không có phương pháp trực tiếp, chỉ một phương pháp yêu cầu một diễn viên tiềm ẩn. Vì vậy, tôi mong đợi nó sẽ tìm kiếm một phương pháp trực tiếp. –

+4

"tất cả các cuộc gọi hiện có đến phương thức tiện ích mở rộng sẽ tự động được chuyển sang phương pháp thể hiện mới". - Lưu ý điều này chỉ tính khi biên dịch lại. Một cuộc gọi mở rộng chỉ được dịch một cách đơn giản thành một cuộc gọi phương thức tĩnh. – Dykam

+1

Trình biên dịch sẽ cố gắng hết sức để đáp ứng yêu cầu giải pháp phương pháp với một phương thức thể hiện - bằng cách sử dụng chuyển đổi ngầm định nếu cần. Nó chỉ xem xét các phương thức mở rộng nếu nó không thể. Ngoài ra cố gắng phôi tiềm ẩn để tìm một phương pháp dụ là std. hành vi. ví dụ MyFunc ('A') sẽ phân giải thành tĩnh void MyFunc (int a) với = 65. Bạn có thể tránh tất cả điều này bằng cách chỉ định phương thức mở rộng của bạn thành tên không được lấy - nhưng bạn không bao giờ có thể chắc chắn, xem cuối cùng para. – Gishu

2

Hành vi này là chính xác. Lý do là việc giới thiệu một phương thức mở rộng không nên thay đổi cách mã hiện tại thực hiện. Mã nên hoạt động chính xác như nhau hoặc không có phương pháp mở rộng "thừa" này. Nó có vẻ phản trực giác trong một số trường hợp (như của bạn), nhưng xảy ra vì một lý do.

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