gpt4 book ai didi

c# - 使用 "dynamic"的基于接口(interface)的方法调用是否仍应遵守 C# 方法解析规则?

转载 作者:可可西里 更新时间:2023-11-01 03:02:09 26 4
gpt4 key购买 nike

据我了解,每种语言都可以拥有自己的 dynamic 处理程序,以便应用适当的规则。我不确定以下内容是否正确/不正确;想法?

场景:两个接口(interface)(一个实现另一个)和一些方法:

public interface IA {
void Bar(object o);
}
public interface IB : IA {
void Foo(object o);
}

和一个基本的实现:

public class B : IB {
public void Foo(object o) { Console.WriteLine("Foo"); }
public void Bar(object o) { Console.WriteLine("Bar"); }
}

现在,使用普通的 C#(没有 dynamic),我们可以从 IB 类型的目标访问 IA 的方法:

IB b = new B();
var o = new { y = "z" };
b.Foo(o.y); // fine
b.Bar(o.y); // fine

现在让我们特意在参数中添加一些dynamic,这使得整个调用使用dynamic处理(因为在一般情况下这可以影响重载决议,虽然它不会在这里):

IB b = new B();
dynamic x = new {y = "z"};
b.Foo(x.y); // fine
b.Bar(x.y); // BOOM!

失败并返回 RuntimeBinderException:

'IB' does not contain a definition for 'Bar'

现在,它所说的完全正确,因为 IB 没有 Bar 方法。然而,如第一个示例所示:在正常的 C# 规则下,由于目标的声明类型是接口(interface) (IB),因此已知要实现的其他接口(interface)(即 IA ) 作为重载决议的一部分进行检查。

那么:这是一个错误吗?还是我看错了?

最佳答案

这是 Binder 的一个众所周知的限制,在 SO 和 this feedback article 的主题中多次被问到。 .我将引用微软的回答:

This was an area we explicitly scoped out due to time when shipping C# 4.0 and we'd love to revisit this. This specific case of ISet/IList methods that are actually defined on ICollection is the most visible place where not digging up through parent interfaces unnecessarily limits the reach of dynamic binding in C#.

We hope to add such support soon, though this issue currently falls just below our bug triage cut line. We're marking the issue Won't Fix to indicate that we're not currently tracking to fix this issue in the next release of Visual Studio. We'll reactivate this bug over the next year if we get further than expected through our bug triage list, or if we revisit the bug for the following release.

这还没有发生,afaik。这篇文章没有很多选票。

关于c# - 使用 "dynamic"的基于接口(interface)的方法调用是否仍应遵守 C# 方法解析规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9837472/

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