为什么我必须从动态输入类型参数中转换结果

Sha*_*ish 0 .net c# dynamic-language-runtime

我有一个返回double的简单动态对象:

class MyDynamic : DynamicObject
{
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = 2.0;
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我尝试调用一个接受int的方法:

    private static void SomeMethod(int number)
    {

    }
Run Code Online (Sandbox Code Playgroud)

然后,我打电话并将我的值传递给dynamic方法:

        dynamic x = new MyDynamic();
        SomeMethod(x.number);
Run Code Online (Sandbox Code Playgroud)

现在,这会导致异常,因为运行时抱怨它找不到相关的方法.这是预期的行为吗?我原本希望运行时自动将返回值强制转换为方法请求的类型(在本例中为int).

这是什么东西应该工作?

Jon*_*eet 7

我原本希望运行时自动将返回值强制转换为方法请求的类型(在本例中为int).

你为什么期望它这样做?没有隐式转换doubleint正常,所以为什么你会在动态类型的上下文中期望它?

换一种方式-如果x.number静态类型的返回double,你会得到一个编译时失败.使用动态类型时的执行时失败是镜像相同的失败.基本上,当参数的类型已知时,尝试找到正确的调用方法将被推迟到执行时间.该类型参数的结果是double,并没有隐式转换从doubleint,所以你得到一个例外.

如果你反过来尝试它 - 提供intin TryGetMember然后调用方法接受double- 那么隐式转换应该启动.

请注意,您可以使用显式转换来自doubleint同一个投:

SomeMethod((int) x.number);
Run Code Online (Sandbox Code Playgroud)

这就使得重载在编译时,只是将转换x.numberint执行时...这是很好的,因为这里的明确从转换doubleint存在.

请注意,您不必使用方法来演示此:

int y = x.number; // Fails at execution time
int z = (int) x.number; // Works
Run Code Online (Sandbox Code Playgroud)

基本上,从转换doubleint是明确的,并且你要明确的是需要在动态类型的坚持了.