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 TA
có thể là bất cứ thứ gì thì về mặt kỹ thuật, nó cũng có thể là một B
thứ sẽ dẫn đến sự mơ hồ về hai cách Handle
triể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ể. TA
phả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ế TA
bằ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 MyFoo
lớp chung chung như một lớp không chung chung riêng biệt cho mọi TA
kiểu dẫn xuất có thể có?