C# 为什么我必须将动态结果转换为类型化参数

C# 为什么我必须将动态结果转换为类型化参数,c#,.net,dynamic-language-runtime,C#,.net,Dynamic Language Runtime,我有一个简单的动态对象,它返回一个双精度: class MyDynamic : DynamicObject { public override bool TryGetMember(GetMemberBinder binder, out object result) { result = 2.0; return true; } } 然后,我尝试调用一个接受int的方法: private static void SomeMethod(

我有一个简单的动态对象,它返回一个双精度:

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 x = new MyDynamic();
        SomeMethod(x.number);
现在,这会导致一个异常,因为运行时抱怨它找不到相关的方法。这是预期的行为吗?我希望运行时自动将返回值强制转换为方法请求的任何类型(在本例中为int)

这些东西应该是这样工作的吗

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

你为什么期望它会这样做?通常情况下,没有从
double
int
的隐式转换,那么为什么您希望在动态类型的上下文中使用它呢

换句话说,如果静态键入
x.number
以返回
double
,则编译时会失败。使用动态类型时的执行时间故障反映了相同的故障。基本上,找到正确的调用方法的尝试被推迟到执行时,此时参数的类型是已知的。参数的类型是
double
,并且没有从
double
int
的隐式转换,因此您得到了一个异常

如果您尝试另一种方法—在
TryGetMember
中提供
int
,然后调用接受
double
的方法—则隐式转换应该开始

请注意,您可以通过强制转换使用从
double
int
的显式转换:

SomeMethod((int) x.number);
这将强制在编译时进行重载解析,并在执行时将
x.number
转换为
int
。。。这很好,因为存在从
double
int
的显式转换

请注意,您不必使用方法来演示这一点:

int y = x.number; // Fails at execution time
int z = (int) x.number; // Works

基本上,从
double
int
的转换是明确的,在动态键入中也支持对您明确的要求。

如果您能编辑问题,提供一个简短但完整的程序来演示该问题,这将很有帮助,而不仅仅是片段-并在你的问题中显示完整的例外。这是有意义的。谢谢我过分期望dynamic的行为更像dynamic语言(您希望这种转换会自动发生)。因为在一天结束时,
dynamic
的DLR位需要与严格类型的C#code交互,这是完全有意义的。谢谢。@ShaharPrish-即使在动态语言中,它们也不允许随意转换可能导致数据丢失的类型,而不会抛出某种错误(至少在任何合适的动态语言中不会)。你到底期望什么?它只是截断小数点,而不告诉你?这是一个巨大的、潜在的灾难性错误。。相当多的动态语言确实允许这样做(尽管您的“得体”部分允许您对所有这些语言都打折)。当与COM对象(当然不是语言本身,而是内置于其中以允许通信的扩展)交谈时,JavaScript将透明地执行此操作。vbscript也是如此。与VB/VBA相同。与大多数flavors或SQL相同,它们是一种脚本语言。其他常见的动态语言/脚本没有ints vs.Double的定义,因此很难找到相关的示例。