Trong khi điều tra cách hoạt động của từ khóa động C#, tôi tình cờ gặp một số hành vi lạ. Nó gần như trông giống như một con bọ, nhưng có lẽ nhiều khả năng là có một lý do cho hành vi đó.Hành vi năng động lạ C#
Trong mã bên dưới, có hai cuộc gọi, một đến obj1 và một đến obj2, nhưng chỉ một trong số chúng thực thi chính xác. Dường như kiểu biến cục bộ là lý do, nhưng "Hello" cũng có thể truy cập được từ IDynamicTarget, vì nó mở rộng IDynamicTargetBase.
namespace DynamicTesting
{
interface IDynamicTargetBase
{
string Hello(int a);
}
interface IDynamicTarget : IDynamicTargetBase
{
}
class DynamicTarget : IDynamicTarget
{
public string Hello(int a)
{
return "Hello!";
}
}
class Program
{
static void Main(string[] args)
{
dynamic a = 123;
IDynamicTargetBase obj1 = new DynamicTarget();
obj1.Hello(a); // This works just fine
IDynamicTarget obj2 = new DynamicTarget();
obj2.Hello(a); // RuntimeBinderException "No overload for method 'Hello' takes '1' arguments"
}
}
}
vẻ để làm việc trên Mono: http://ideone.com/PGn3Jp. Đây là một phiên bản thất bại trên .Net Fiddle: https://dotnetfiddle.net/55ZMAG – Kobi
Đây là một lỗi địa ngục để bỏ qua nó trong năm năm nay. –
BTW là một lỗi ưu tiên thấp vì nếu đối số là biên dịch- thời gian đã nhập, cùng một mã trong câu hỏi này sẽ hoạt động. Tôi cảm thấy rằng có vài trường hợp bạn đưa ra một đối số năng động ... –