这有效:
dynamic exp = new List<int>();
exp.Add(4);
但这不是:
dynamic exp = new List<int>();
exp.Add((object)4);
RuntimeBinderException: The best overloaded method match for 'System.Collections.Generic.List<int>.Add(int)' has some invalid arguments
这是一个例子,但在实际代码中,我不知道类型,但在运行时。
有没有办法使用实例参数类型绑定绑定器?并且只有他们不匹配才能提出异常?
答案 0 :(得分:3)
问题是List<int>
不是动态对象。它具有已知的运行时类型并保留int
。将变量声明为dynamic
并不会改变这一点。您只能将int
值添加到该列表中,否则您将在运行时获得异常。在您的特定情况下,List<int>.Add(object)
不存在,因此会因绑定程序异常而失败。
由于您在编译时不知道类型,而不是生成变量dynamic
,因此请将其声明为IList
。通用列表实现包含IList
的{{1}}接口,并且可以接受底层实现允许的任何类型(IList.Add(object)
)。您仍然需要确保这些值与该列表兼容,否则您将获得参数异常。