2011-12-08 37 views
6

Bất cứ ai có thể giải thích, tại sao mã sau tạo lỗi? (Biên soạn trong Microsoft Visual Studio 2008)Tại sao cuộc gọi này trở nên mơ hồ?

class Base1 { }; 
class Base2 { } 

interface I1 { } 
interface I2 { } 

class C : I1, I2 { } 

static class Program 
{ 

    static T M1<T>(this T t, I1 x) where T : Base1 
    { 
     return t; 
    } 

    static T M1<T>(this T t, I2 x) where T : Base2 
    { 
     return t; 
    } 

    static void Main(string[] args) 
    { 
     Base1 b1 = new Base1(); 
     C c = new C(); 
     b1.M1(c); 
    } 
} 

lỗi là

Cuộc gọi là mơ hồ giữa các phương thức hoặc thuộc tính sau: 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I1)' và 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I2)'

tôi nghĩ rằng trình biên dịch có thể phân biệt giữa hai phương pháp sử dụng mệnh đề "where"

+0

Tôi không nghĩ rằng các ràng buộc chung chung đủ điều kiện như một phần của chữ ký phương thức. – oscilatingcretin

+0

Các ràng buộc chung không tham gia vào quá trình phân giải quá tải. – Oded

+0

Đây không may là một câu hỏi trùng lặp. Ý chính của nó là các ràng buộc chung không được xem xét khi tìm kiếm các phương thức so sánh các phương thức kết hợp khả thi, và trình biên dịch không thành công trước khi xem xét. Có rất nhiều câu hỏi ở đây về SO đã được về điều này, tôi chỉ cần tìm các từ khóa tìm kiếm phù hợp. –

Trả lời

13

Ràng buộc không phải là một phần của chữ ký cho các phương pháp và do đó không được sử dụng để giải quyết.

0

Không thể sử dụng hạn chế để giải quyết liên kết.

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