变量无法检测到具有动态输入的方法的结果

4

我有以下问题

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

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

但是x仍然是动态的。我不理解为什么。

错误的类型


这对我有效 https://dotnetfiddle.net/BTfGp3 - TheGeneral
@MichaelRandall 所以这意味着,.GetType() 在运行时被解析。 - Salah Akbari
1个回答

7

由于在GetInt方法调用中,您的参数a具有dynamic类型,因此重载决策发生在运行时而不是在编译时

根据此文:

如果方法调用中的一个或多个参数具有dynamic类型,或者方法调用的接收器是dynamic类型,则重载决策将在运行时而不是在编译时发生。

实际上,使用dynamic即使用了后期绑定(推迟到更晚的绑定时间),这意味着编译器无法验证它,因为它不再使用任何静态类型分析。

解决方法是像这样使用强制转换:

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接