var 未检测具有动态输入的方法的结果

var is not detecting result of method with dynamic input

我有以下问题

private int GetInt(dynamic a)
{
    return 1;
}

private void UsingVar()
{
    dynamic a = 5;
    var x = GetInt(a);
}

但是 x 仍然是动态的。 我不明白为什么。

由于您在 GetInt 方法调用中的参数 a 具有动态类型,因此重载解析发生在 运行 时间 编译时

基于this

Overload resolution occurs at run time instead of at compile time if one or more of the arguments in a method call have the type dynamic, or if the receiver of the method call is of type dynamic.

实际上通过使用 dynamic 你使用的是 late binding (推迟到后面),这意味着编译器无法验证它,因为它不会使用任何静态类型分析没有了。

解决方案是使用这样的转换:

var x = (int)GetInt(a);

以下是编译器如何处理您的代码:

private void UsingVar()
{
    object arg = 5;
    if (<>o__2.<>p__0 == null)
    {
        Type typeFromHandle = typeof(C);
        CSharpArgumentInfo[] array = new CSharpArgumentInfo[2];
        array[0] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null);
        array[1] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
        <>o__2.<>p__0 = CallSite<Func<CallSite, C, object, object>>
           .Create(Microsoft.CSharp.RuntimeBinder.Binder
           .InvokeMember(CSharpBinderFlags.InvokeSimpleName, "GetInt", null, typeFromHandle, array));
    }
    object obj = <>o__2.<>p__0.Target(<>o__2.<>p__0, this, arg);
}