gpt4 book ai didi

c# - 为什么调用 ISet.Contains() 编译,但在运行时抛出异常?

转载 作者:IT王子 更新时间:2023-10-29 04:31:28 26 4
gpt4 key购买 nike

请帮我解释以下行为:

dynamic d = 1;
ISet<dynamic> s = new HashSet<dynamic>();
s.Contains(d);

代码编译时没有错误/警告,但在最后一行出现以下异常:

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

据我所知,这与动态重载决议有关,但奇怪的是

(1) 如果s的类型是HashSet<dynamic> , 没有异常发生。

(2) 如果我将非泛型接口(interface)与接受动态参数的方法一起使用,则不会发生异常。

因此,看起来这个问题特别与通用接口(interface)有关,但我无法找出问题的确切原因。

这是编译器/类型系统中的错误,还是合法行为?

最佳答案

到目前为止,您收到的答复并不能解释您所看到的行为。 DLR 应该找到方法 ICollection<object>.Contains(object)并使用装箱整数作为参数调用它,即使变量的静态类型是 ISet<dynamic>而不是 ICollection<dynamic> (因为前者源自后者)。

因此,我认为这是一个错误并且 I have reported it to Microsoft Connect. 如果事实证明这种行为在某种程度上是可取的,他们会在那里发表评论。

关于c# - 为什么调用 ISet<dynamic>.Contains() 编译,但在运行时抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3696047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com