gpt4 book ai didi

c# - 向 IList 添加动态失败

转载 作者:可可西里 更新时间:2023-11-01 09:13:28 24 4
gpt4 key购买 nike

在下面的代码示例中调用 l.Add(s)c.Add(s)是成功的,但是对于通用的 IList<string> 失败了.

    var l = new List<string>();
dynamic s = "s";
l.Add(s);
var c = (ICollection<string>)l;
c.Add(s);
var i = (IList<string>)l;
i.Add("s"); // works
i.Add(s); // fails

https://dotnetfiddle.net/Xll2If

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: No overload for method 'Add' takes '1' arguments at CallSite.Target(Closure , CallSite , IList`1 , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1) at Program.Main() in C:\Dev\PlayGround\PlayGround\Program.cs:line 13

IList<T>源自 ICollection<T> .有人可以解释为什么要调用IList.Add吗?失败了?

最佳答案

在查找绑定(bind)调用的方法时,编译器(无论是静态的还是动态的)可能必须检查基类型。

通常使用 dynamic 我们处理对 dynamic 对象本身的方法的调用,因此动态编译器从对象的具体类型开始通过 dynamic 使用,只需要沿其继承链上升,直到到达 object 即可查找它们。

dynamic 对象被作为参数传递给静态引用为接口(interface)类型的方法调用的情况下,动态绑定(bind)器遗憾地做了同样的事情:如果它没有在有问题的类型上找到方法,然后查看该类型的 BaseType,对于接口(interface)来说,它是 null。因此,它的行为与它正确检查继承但未能找到有问题的方法并针对该情况抛出适当的异常时的行为相同。 (请注意,这也意味着它无法找到定义在 object 上的 Equals 方法)。

对于这种情况,它应该做的是检查所有由相关接口(interface)类型实现的接口(interface)。

这个错误是 fixed in .NET Core但该修复程序尚未移植到 .NET Framework。如果您想针对 netfx 提交错误报告,您可能需要在 corefx 中引用该修复。

有时可以通过定义所用方法的基接口(interface)访问接口(interface)类型本身来解决这个问题,或者因为它本身是 dynamic(因此可以在具体化的任何一个中找到适当的方法类型实现它)。

关于c# - 向 IList<T> 添加动态失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51240596/

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