Mã không biên dịch hiện tại của tôi tương tự như sau:
public abstract class A { }
public class B { }
public class C : A { }
public interface IFoo<T>
{
void Handle(T item);
}
public class MyFoo<TA> : IFoo<TA>, IFoo<B>
where TA : A
{
public void Handle(TA a) { }
public void Handle(B b) { }
}
Trình biên dịch C # từ chối biên dịch điều này, trích dẫn quy tắc / lỗi sau:
'MyProject.MyFoo <TA>' không thể triển khai cả 'MyProject.IFoo <TA>' và 'MyProject.IFoo <MyProject.B>' vì chúng có thể thống nhất đối với một số thay thế tham số kiểu
Tôi hiểu lỗi này có nghĩa là gì; nếu TAcó thể là bất cứ thứ gì thì về mặt kỹ thuật, nó cũng có thể là một Bthứ sẽ dẫn đến sự mơ hồ về hai cách Handletriển khai khác nhau .
Nhưng TA không thể là gì cả. Dựa trên hệ thống phân cấp kiểu, TA không thể là B- ít nhất, tôi không nghĩ nó có thể. TAphải bắt nguồn từ A, không bắt nguồn từ B, và rõ ràng là không có nhiều lớp kế thừa trong C # /. NET.
Nếu tôi xóa tham số chung và thay thế TAbằng C, hoặc thậm chí A, tham số đó sẽ biên dịch.
Vậy tại sao tôi lại gặp lỗi này? Đó có phải là một lỗi trong hoặc sự thiếu thông minh chung của trình biên dịch, hay là tôi đang thiếu thứ gì khác?
Có cách giải quyết nào không hay tôi sẽ phải triển khai lại MyFoolớp chung chung như một lớp không chung chung riêng biệt cho mọi TAkiểu dẫn xuất có thể có?