Trong C#, xin vui lòng không ai biết tại sao tôi không thể làm như sau? (Đặc biệt là dòng được đánh dấu 'KHÔNG tốt!' Bên dưới)Tại sao liên kết động bị lỗi khi sử dụng giao diện thừa kế?
interface A
{
void Add(dynamic entity);
}
interface B : A {}
class C : B
{
public void Add(dynamic entity)
{
System.Console.WriteLine(entity);
}
}
class Program
{
static void Main(string[] args)
{
B b = new C();
dynamic x = 23;
b.Add(23); // fine
b.Add((int)x); // fine
(b as A).Add(x); // fine
//b.Add(x); // NOT fine!
}
}
tôi đã hoàn toàn không có vấn đề nếu cuộc gọi không được tự động bị ràng buộc, hoặc nếu tôi dứt khoát đúc để giao diện ở thư mục gốc của hệ thống phân cấp, nhưng cuộc gọi tự động bị ràng buộc mang lại cho tôi:
Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: No overload for method 'Add' takes '1' arguments
at CallSite.Target(Closure , CallSite , B , Object)
at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1)
at Program.Main(String[] args) in C:\Users\Stuart\Documents\Visual Studio 2010\Projects\CSharp Testbed\Program.cs:line 218
Bằng cách này, cuộc gọi cuối cùng không thành công ngay cả khi không có thừa kế kim cương. –
@YuriyGuts: Vì vậy, nhiều cho một ví dụ compileable tối thiểu eh? :) Ok, đơn giản hóa câu hỏi trong trường hợp đó. –
+1 - Nó cũng có thể là tốt để lưu ý rằng 'b.Add ((int) x)' hoạt động. –