And*_*lav 22 c# generics dynamic .net-4.0
请帮我解释一下这个行为:
dynamic d = 1;
ISet<dynamic> s = new HashSet<dynamic>();
s.Contains(d);
Run Code Online (Sandbox Code Playgroud)
代码编译没有错误/警告,但在最后一行我得到以下异常:
Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Collections.Generic.ISet<object>' does not contain a definition for 'Contains'
at CallSite.Target(Closure , CallSite , ISet`1 , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1)
at FormulaToSimulation.Program.Main(String[] args) in
Run Code Online (Sandbox Code Playgroud)
据我所知,这与动态重载分辨率有关,但奇怪的是
(1)如果是s的类型,则HashSet<dynamic>不会发生异常.
(2)如果我使用非泛型接口和接受动态参数的方法,则不会发生异常.
因此,看起来这个问题特别与通用接口有关,但我无法找出导致问题的确切原因.
它是编译器/类型系统中的错误还是合法行为?
到目前为止,您收到的答案并未解释您所看到的行为.DLR应该找到方法ICollection<object>.Contains(object)并使用盒装整数作为参数调用它,即使变量的静态类型ISet<dynamic>不是ICollection<dynamic>(因为前者来自后者).
因此,我认为这是一个错误,我已将其报告给Microsoft Connect.如果事实证明这种行为在某种程度上是可取的,那么他们会在那里发表评论.