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).
这是什么东西应该工作?
我原本希望运行时自动将返回值强制转换为方法请求的类型(在本例中为int).
你为什么期望它这样做?没有隐式转换double到int正常,所以为什么你会在动态类型的上下文中期望它?
换一种方式-如果x.number是静态类型的返回double,你会得到一个编译时失败.使用动态类型时的执行时失败是镜像相同的失败.基本上,当参数的类型已知时,尝试找到正确的调用方法将被推迟到执行时间.该类型参数的结果是double,并没有隐式转换从double到int,所以你得到一个例外.
如果你反过来尝试它 - 提供intin TryGetMember然后调用方法接受double- 那么隐式转换应该启动.
请注意,您可以使用显式转换来自double于int同一个投:
SomeMethod((int) x.number);
Run Code Online (Sandbox Code Playgroud)
这就使得重载在编译时,只是将转换x.number到int执行时...这是很好的,因为这里的明确从转换double到int存在.
请注意,您不必使用方法来演示此:
int y = x.number; // Fails at execution time
int z = (int) x.number; // Works
Run Code Online (Sandbox Code Playgroud)
基本上,从转换double到int是明确的,并且你要明确的是需要在动态类型的坚持了.