其他分享
首页 > 其他分享> > CodeGo.net>使用动态变量作为方法参数禁用(某些)编译器检查

CodeGo.net>使用动态变量作为方法参数禁用(某些)编译器检查

作者:互联网

有人可以向我解释一下,如果将动态变量用作方法调用的参数,为什么编译器不检查函数的返回类型?

class Program
{
    static void Main(string[] args)
    {
        // int a = GetAString(1); // Compiler error CS0029 Cannot impilicitly convert type 'string' to 'int'

        dynamic x = 1;

        int b = GetAString(x); // No compiler error -> Runtime Binder Exception 

        // int c = (string)GetAString(x); // Compiler error CS0029 Cannot impilicitly convert type 'string' to 'int'
    }

    static string GetAString(int uselessInt)
    {
        return "abc";
    }
}

解决方法:

通过使用动态,编译器将在使用动态参数的任何位置生成调用站点.该调用站点将尝试在运行时解析该方法,如果找不到匹配的方法,则会引发异常.

在您的示例中,呼叫站点检查x并发现它是一个int.然后,它查找名为GetAString的任何方法,这些方法采用int并找到您的方法并生成代码以进行调用.

接下来,它将生成代码以尝试将返回值分配给b.所有这些操作仍在运行时完成,因为动态变量的使用使整个表达式都需要运行时评估.呼叫站点将查看它是否可以生成将字符串分配给int的代码,因为它不能生成异常.

顺便说一句,您的示例没有多大意义,因为您似乎想为int分配字符串.GetAsString方法甚至返回非数字值,因此永远不会将其分配给int.如果您写:

dynamic x = 1;
string b = GetAsString(x);

然后一切都会正常.

标签:compiler-errors,dynamic,c
来源: https://codeday.me/bug/20191118/2030972.html