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