2010-08-10 28 views
6
class Program 
{ 
    public delegate void VoidMethodDelegate(); 
    public delegate int IntMethodDelegate(); 

    static void Main(string[] args) 
    { 
     Test(IntMethod); 
     Test(VoidMethod); 
    } 

    static int IntMethod() 
    { 
     return 1; 
    } 

    static void VoidMethod() 
    { 
    } 

    static void Test(VoidMethodDelegate method) 
    { 
    } 

    static void Test(IntMethodDelegate method) 
    { 
    } 
} 

Tôi đang cố gắng thiết lập phương thức quá tải sẽ lấy hai loại đại biểu khác nhau. Các đại biểu chỉ khác nhau theo kiểu trả về - trong cả hai trường hợp, chúng không có tham số đầu vào. Vì vậy, trong ví dụ trên, tôi muốn có thể gọi Test() và vượt qua nó hoặc là một phương thức trả về void, hoặc một phương thức trả về int. Khi tôi biên dịch mã trên, tôi nhận được các lỗi này:Lỗi cuộc gọi mơ hồ với phương thức quá tải lấy 2 đại biểu có các loại trả lại khác nhau

lỗi CS0121: Cuộc gọi là mơ hồ giữa các phương pháp sau hoặc tính: 'ConsoleApplication1.Program.Test (ConsoleApplication1.Program.VoidMethodDelegate)' và 'ConsoleApplication1.Program.Test (ConsoleApplication1.Program.IntMethodDelegate)'

lỗi CS0407: 'int ConsoleApplication1.Program.IntMethod()' có kiểu trả về sai

lỗi CS0121: Cuộc gọi là mơ hồ giữa các phương pháp sau hoặc tính: 'ConsoleApplication1.Program.Test (ConsoleApplication1.Program.VoidMethodDelegate)' và 'ConsoleApplication1.Program.Test (ConsoleApplication1.Program.IntMethodDelegate)

tôi biết tôi có thể làm việc xung quanh lỗi nếu tôi có thể tạo các đại biểu với mới thay vì chỉ đi qua phương pháp trực tiếp như thế này:

static void Main(string[] args) 
    { 
     Test(new IntMethodDelegate(IntMethod)); 
     Test(new VoidMethodDelegate(VoidMethod)); 
    } 

Nhưng cú pháp đó lộn xộn và tôi muốn có thể chuyển trực tiếp phương thức, thay vì phải quấn nó trong một cuộc gọi đến mới. Giải pháp duy nhất tôi thấy là loại bỏ phiên bản quá tải của Test() và thay vào đó sử dụng hai phương thức khác nhau, mỗi phương thức có một tên khác nhau.

Bất cứ ai có thể cho tôi biết tại sao trình biên dịch phàn nàn rằng điều này không rõ ràng? Tôi không hiểu tại sao trình biên dịch không thể quyết định sử dụng hai trạng thái quá tải nào.

+0

bản sao có thể có của [Lỗi trình biên dịch không rõ ràng của trình biên dịch - phương thức ẩn danh và nhóm phương pháp với Func <> hoặc Action] (http://stackoverflow.com/questions/2057146/compiler-ambiguous-invocation-error-anonymous-method-and -method-group-with-fun) – nawfal

+0

Không biết nó đẹp hơn bao nhiêu, nhưng thay vì 'Test (new IntMethodDelegate (IntMethod));' bạn có thể sử dụng 'Test ((IntMethodDelegate) IntMethod);'. Việc chuyển đổi từ một nhóm phương thức sang kiểu ủy nhiệm thường ngầm, nhưng bạn cũng có thể sử dụng cú pháp (rõ ràng) (và phải trong trường hợp này). –

Trả lời

7

Về cơ bản đây là một hệ quả của việc thực hiện quá tải và cách các chuyển đổi nhóm phương pháp được giải quyết. Tôi có thể cố gắng lội qua thông số để tìm ra lý do chính xác của nếu bạn thích, nhưng tin xấu là đó chỉ là cách thực hiện. Đó là có thể có lỗi trình biên dịch trong trường hợp này, nhưng có nhiều khả năng nó chỉ là một bit phức tạp của thông số kỹ thuật.

I nghĩ rằng this SO question may be relevant, nhưng tôi chưa chọn.

Thay vì giải quyết bằng cách sử dụng new, tôi khuyên bạn nên chọn tùy chọn sử dụng các tên phương thức khác nhau. Quá tải có tất cả các loại trường hợp góc lén lút - điều này ít nhất là vô hại ở chỗ nó gây ra lỗi biên dịch thay vì chọn quá tải bạn không muốn vào thời gian thực thi. Loại bỏ quá tải thường là một điều tốt :)

EDIT: Tôi khá chắc chắn rằng câu hỏi SO khác có liên quan, thực sự. Tôi đề nghị bạn hãy cho mình một tách cà phê, thông số C# 4, và sau đó đọc câu trả lời của Eric rất cẩn thận. Sau đó thay đổi tên phương thức để bạn không phải nghĩ về nó nữa.

+0

Cảm ơn bạn đã liên kết, tôi đã bỏ lỡ liên kết đó trong các tìm kiếm ban đầu của mình. Tôi đồng ý với việc sử dụng các phương pháp có tên khác nhau, đó là những gì tôi sẽ làm, tôi chỉ muốn đảm bảo rằng tôi không bỏ lỡ điều gì đó hiển nhiên. –

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