为什么“;动态的“;需要特定于语言的运行时组件

本文关键字:语言 运行时 组件 动态 为什么 于语言 | 更新日期: 2023-09-27 18:28:21

Microsoft.CSharp需要使用dynamic功能
据我所知,组装过程中有装订工、评估员和助手
但为什么它必须是特定语言的呢
为什么是Microsoft.CSharp而不是Microsoft.Dynamic或System.Dynamic?

请解释一下
假设我们有d.x,其中ddynamic
C#编译器
1.应用C#语言规则
2.获得"属性或字段访问权限"
3.发射(象征性地)Binder.GetPropertyOrField(d,"x")
现在,被要求引用Microsoft.CSharp可能会让人认为语言无关的binder无法处理这种情况,而C#-only东西通过编译获得了它的方式,并且需要特殊的库
编译器今天过得不好?

为什么“;动态的“;需要特定于语言的运行时组件

对于您的第一个问题,它是特定于语言的,因为它需要.

在C#中,您调用一个参数过多的方法时会得到一个错误。在Javascript中,额外的参数被简单地忽略。在C#中,您访问一个不存在的成员并得到一个错误,而在Javascript中,您得到undefined。即使你发现了所有这些不同的功能集,并将其全部放入System.Core中,本月的下一个语言时尚肯定会有一些它不支持的超级整洁的功能。灵活一点比较好。

.NET核心中的System.Dynamic和System.Runtime.CompilerServices命名空间下有公共代码。这不可能都是常见的。

至于你的第二个问题,当然可以通过内联转换这些特定于语言的行为来消除对"特殊C#库"的需求,但为什么呢?这将不必要地扩大您的IL代码大小。这和你每次需要读一个数字时不写自己的Int32.Parse是一样的道理。

我能想到的一个原因是,Visual Basic.NET从第一天起就有后期绑定,主要围绕着它如何与COM IDispatch接口互操作而定,所以如果他们想要一个与语言无关的绑定器,他们就必须采用Visual Basic规则,其中包括成员查找仅适用于Public成员。

显然,C#的设计者不想这么严格。您可以通过动态引用从C#调用此类的DoStuff方法:

public class Class1
{
    internal void DoStuff()
    {
        Console.WriteLine("Hello");
    }
}

而试图通过Visual Basic的Object调用它会在运行时产生MissingMemberException

因此,因为C#设计者不是第一个加入后期绑定派对的人,他们可以效仿Visual Basic,也可以说"每种语言都有自己的规则"——他们选择了后者。