为什么“;动态的“;需要特定于语言的运行时组件
本文关键字:语言 运行时 组件 动态 为什么 于语言 | 更新日期: 2023-09-27 18:28:21
Microsoft.CSharp需要使用dynamic
功能
据我所知,组装过程中有装订工、评估员和助手
但为什么它必须是特定语言的呢
为什么是Microsoft.CSharp而不是Microsoft.Dynamic或System.Dynamic?
请解释一下
假设我们有d.x
,其中d
是dynamic
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,也可以说"每种语言都有自己的规则"——他们选择了后者。