2010-04-23 29 views
8

Tôi có đoạn mã sau:Trình biên dịch chọn phương thức nào để gọi khi kiểu tham số không rõ ràng?

[TestMethod] 
    public void TestFoo() 
    { 
     Foo(null); 
    } 

    private void Foo (object bar) 
    { 
     Console.WriteLine("Foo - object"); 
    } 

    private void Foo (string bar) 
    { 
     Console.WriteLine("Foo - string"); 
    } 

và khi tôi chạy thử nghiệm "TestFoo()", giao diện điều khiển đầu ra là "Foo - chuỗi". Trình biên dịch quyết định phương thức nào cần gọi?

Trả lời

16

Áp dụng quy tắc "chuyển đổi tốt hơn" (7.4.3.3 của thông số C# 3) như một phần của độ phân giải quá tải (phần 7.4.3 nói chung).

Về cơ bản trong trường hợp này, có chuyển đổi từ string thành object, nhưng không phải từ object đến string. Theo các quy tắc, điều đó có nghĩa là chuyển đổi từ null thành string là tốt hơn so với quy tắc từ null đến object, vì vậy quá tải với thông số string được sử dụng.

độ phân giải quá tải có thể nhận được vô cùng phức tạp khi các yếu tố sau tham gia:

  • Có thể có phương pháp chung trong ứng cử viên thiết lập
  • Nếu có phương pháp chung chung, kiểu suy luận được áp dụng cho mỗi người trong số Nếu có bất kỳ đối số nào là nhóm phương pháp, chúng có thể được chuyển đổi thành các loại đại biểu khác nhau - thậm chí có thể sử dụng các chữ ký phương thức khác nhau nếu nhóm phương pháp được đặt tên là als o có nhiều quá tải
  • thừa kế có thể dẫn đến kết quả đáng ngạc nhiên
  • mảng Parameter (params) thêm niềm vui cho
  • thông số tùy chọn trong C# 4 đóng góp vào sự quyết định quá

Về cơ bản quá tải có thể là một thực sự có thể của sâu - nếu có thể, thiết kế quá tải để chỉ một trong số họ sẽ là một mục tiêu hợp lệ của bất kỳ cuộc gọi phương thức nhất định, do đó bạn không cần phải lo lắng về các quy tắc chi tiết.

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