C# “为什么?”;“动态”;是否需要特定于语言的运行时组件?

C# “为什么?”;“动态”;是否需要特定于语言的运行时组件?,c#,.net,dynamic,C#,.net,Dynamic,Microsoft.CSharp必须使用动态功能。 我知道大会中有装订员、评估员和助手。 但为什么它必须是特定于语言的? 为什么是Microsoft.CSharp而不是Microsoft.Dynamic或System.Dynamic 请解释一下。 假设我们有d.x其中d是动态的 C#编译器 1.应用C#语言规则 2.获取“属性或字段访问权限” 3.emits(图中)Binder.GetPropertyOrField(d,“x”) 现在,被要求参考Microsoft.CSharp可能会让人认为语言

Microsoft.CSharp必须使用
动态
功能。
我知道大会中有装订员、评估员和助手。
但为什么它必须是特定于语言的?
为什么是Microsoft.CSharp而不是Microsoft.Dynamic或System.Dynamic

请解释一下。
假设我们有
d.x
其中
d
动态的

C#编译器
1.应用C#语言规则
2.获取“属性或字段访问权限”
3.emits(图中)Binder.GetPropertyOrField(d,“x”)
现在,被要求参考Microsoft.CSharp可能会让人认为语言不可知的binder无法处理这种情况,而C#-只有某些东西通过编译获得了成功,并且需要特殊的库。

编译器度过了糟糕的一天?

我能想到的一个原因是-Visual Basic.NET从第一天起就在其中,主要面向它如何与COM
IDispatch
接口进行互操作-因此,如果他们想要一个语言无关的绑定器,他们必须采用VisualBasic规则,其中包括成员查找仅适用于
Public
成员

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

public class Class1
{
    internal void DoStuff()
    {
        Console.WriteLine("Hello");
    }
}
而试图通过Visual Basic的
对象调用该对象会在运行时导致
MissingMemberException


因此,由于C#designer不是第一个到达后期绑定方的人,他们可以遵循Visual Basic的指导,也可以说“每种语言都有自己的规则”——他们遵循后者。

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

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

.NET核心中的System.Dynamic和System.Runtime.CompilerServices命名空间下有通用代码。这不可能都是普通的


至于你的第二个问题,当然可以通过内联转换这些特定于语言的行为来消除对“特殊C#库”的需求,但为什么呢?这将不必要地增加您的IL代码大小。这与您不编写自己的
Int32.Parse
(每次需要读入一个数字时)的原因相同。

因为基本上是C#特定的运行时编译器部件帮助编译。@CodeCaster当然,当然。但为什么有些东西需要特定于语言的运行时编译器部件才能“未编译”呢?你有例子吗?谢谢,我想我明白你的意思了。程序可能非常复杂,可以从将行为提取到单独的程序集中获益匪浅。没有理由不在框架内托管它(除了可移植性和向后兼容性问题)。拥有自己的规则是可以理解的,但是,它不会立即自动地将我们(至少是我)引导到另一个程序集。另外,读了你的答案后,我得到了一个印象,即VB特定的活页夹(在某些情况下是唯一的)驻留在核心库中。是这样吗?