2017-02-06 20 views
10

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() 
+0

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? –

+0

@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ự. –

Trả lời

11

Ràng buộc của một tham số kiểu chung chung không phải là một phần của chữ ký của phương pháp. Hai phương thức này về cơ bản giống nhau từ một điểm phân giải; khi trình biên dịch cố gắng giải quyết cuộc gọi, nó thấy hai phương thức hợp lệ và không có cách nào để chọn phương thức tốt hơn, do đó cuộc gọi được gắn cờ là mơ hồ.

Bạn có thể đọc thêm về sự cố này here.

+0

Cảm ơn bạn đã liên kết; không thể nói tốt hơn. –

+3

@EricLippert Rất cám ơn bạn, thật khó để vượt qua mức độ tôi đã học về ngôn ngữ và lập trình nói chung, đọc blog của bạn. – InBetween

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