为什么我必须将动态结果转换为类型参数
Why do I have to cast results from dynamic coming into typed parameters
我有一个简单的动态对象,returns 一个双精度对象:
class MyDynamic : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = 2.0;
return true;
}
}
然后,我尝试调用一个采用 int 的方法:
private static void SomeMethod(int number)
{
}
然后,我进行调用并将我的值从 dynamic
传递到方法中:
dynamic x = new MyDynamic();
SomeMethod(x.number);
现在,这会导致异常,因为运行时抱怨找不到相关方法。这是预期的行为吗?我本来希望运行时自动将返回值转换为方法请求的任何类型(在本例中为 int)。
东西应该是这样工作的吗?
I would have expected the runtime to automatically cast the returned value to whatever the type requested by the method is (int, in this instance).
您为什么期望它这样做?通常没有从 double
到 int
的隐式转换,那么为什么你会期望它出现在动态类型的上下文中?
换句话说 - 如果 x.number
被 静态 类型化为 return double
,你会得到一个编译时间失败。使用动态类型时的执行时失败反映了同样的失败。基本上,寻找正确调用方法的尝试被推迟到执行时间,此时参数的类型是已知的。参数的类型原来是 double
,并且没有从 double
到 int
的隐式转换,所以你得到一个异常。
如果你反过来尝试 - 在 TryGetMember
中提供一个 int
然后调用一个接受 double
的方法 - 然后 隐式转换应该开始。
请注意,您可以通过强制转换使用从 double
到 int
的显式转换:
SomeMethod((int) x.number);
这会在编译时强制进行重载解析,并且在执行时仅将 x.number
转换为 int
...这在这里很好,因为 explicit 存在从 double
到 int
的转换。
请注意,您不必使用方法来证明这一点:
int y = x.number; // Fails at execution time
int z = (int) x.number; // Works
基本上,从 double
到 int
的转换是显式的,动态类型也支持您显式的要求。
我有一个简单的动态对象,returns 一个双精度对象:
class MyDynamic : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = 2.0;
return true;
}
}
然后,我尝试调用一个采用 int 的方法:
private static void SomeMethod(int number)
{
}
然后,我进行调用并将我的值从 dynamic
传递到方法中:
dynamic x = new MyDynamic();
SomeMethod(x.number);
现在,这会导致异常,因为运行时抱怨找不到相关方法。这是预期的行为吗?我本来希望运行时自动将返回值转换为方法请求的任何类型(在本例中为 int)。
东西应该是这样工作的吗?
I would have expected the runtime to automatically cast the returned value to whatever the type requested by the method is (int, in this instance).
您为什么期望它这样做?通常没有从 double
到 int
的隐式转换,那么为什么你会期望它出现在动态类型的上下文中?
换句话说 - 如果 x.number
被 静态 类型化为 return double
,你会得到一个编译时间失败。使用动态类型时的执行时失败反映了同样的失败。基本上,寻找正确调用方法的尝试被推迟到执行时间,此时参数的类型是已知的。参数的类型原来是 double
,并且没有从 double
到 int
的隐式转换,所以你得到一个异常。
如果你反过来尝试 - 在 TryGetMember
中提供一个 int
然后调用一个接受 double
的方法 - 然后 隐式转换应该开始。
请注意,您可以通过强制转换使用从 double
到 int
的显式转换:
SomeMethod((int) x.number);
这会在编译时强制进行重载解析,并且在执行时仅将 x.number
转换为 int
...这在这里很好,因为 explicit 存在从 double
到 int
的转换。
请注意,您不必使用方法来证明这一点:
int y = x.number; // Fails at execution time
int z = (int) x.number; // Works
基本上,从 double
到 int
的转换是显式的,动态类型也支持您显式的要求。