Giả sử tôi đã xác định hai loại không liên quan và hai phương pháp khuyến nông với chữ ký tương tự nhưng bộ lọc loại khác nhau:C# phương pháp chung độ phân giải không thành công với một lỗi gọi mơ hồ
public class Foo {}
public class Bar {}
public static class FooExtensions
{
public static TFoo Frob<TFoo>(this TFoo foo) where TFoo : Foo { }
public static TFoo Brob<TFoo>(this TFoo foo) where TFoo : Foo { }
}
public static class BarExtensions
{
public static TBar Frob<TBar>(this TBar bar) where TBar : Bar { }
}
Sau đó, khi tôi viết new Foo().Frob();
tôi nhận được một lỗi
error CS0121: The call is ambiguous between the following methods or properties: 'FooExtensions.Frob<TFoo>(TFoo)' and 'BarExtensions.Frob<TBar>(TBar)'
Ai đó có thể giải thích tại sao điều này không thành công và cách tránh nó?
CHỈNH SỬA: Điều này xảy ra trong Bản cập nhật VS2015 3 và VS2017 RC.
EDIT2: Ý tưởng ở đây là phải có API thạo hoạt động trên một hệ thống phân cấp lớp:
new Foo()
.Frob()
.Brob()
Câu trả lời được chấp nhận là chính xác; Tôi lưu ý rằng những gì bạn đang làm ở đây là một thực hành tồi. Vui lòng không làm cho các phương thức mở rộng mở rộng * mọi thứ *, hoặc bằng cách mở rộng đối tượng, hoặc bằng cách mở rộng loại chung T. Có hầu như luôn luôn có một thiết kế tốt hơn. Trong trường hợp này, tại sao không chỉ đơn giản là mở rộng Foo và Bar? Lợi ích hấp dẫn nào ở đây để tạo ra những lợi ích chung này? –
@EricLippert, tôi đã đơn giản hóa kịch bản khá nhiều. Trong thực tế, các phương thức mở rộng trả về 'TFoo'. Ý tưởng ở đây là có các phương thức API thông thạo hoạt động trên một hệ thống phân cấp lớp. Vì vậy, tôi có thể viết 'Foo mới(). Frob(). Grob(). Blob(); '. Vấn đề phát sinh khi tôi có hai loại độc lập, nhưng với các phương thức mở rộng lấy các đối số tương tự theo cùng một thứ tự. –