动态作为参数传递:无法推断返回类型

Ank*_*jay 0 c#

最近,我遇到了一个关于使用dynamicw的有趣问题。当我将dynamic对象作为参数传递时,无法推断该方法的返回类型。

这是最小的可重现示例:

此代码编译成功:

class Program
{
    public static void Main()
    {
        dynamic data = new { SomeProperty = "ABC" };

        string response = IsTrue(data);
        if (response == "1")
        {
            Console.WriteLine("How can this compile?");
        }
    }

    private static bool IsTrue(object someData)
    {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,IsTrue返回 abool但类型response不是推断为bool。结果,上面的代码编译成功。

在运行应用程序时,我得到以下运行时异常:

未处理的异常。Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:运算符“==”不能应用于 System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0 ,T1,TRet](CallSite 站点, T0 arg0, T1 arg1)

这怎么可能?

Jon*_*eet 5

当您使用 type 参数调用方法时dynamic,调用是动态绑定的 - 因此编译器也将返回类型视为dynamic

在某些情况下,编译器注意到一些不可行的事情,但通常当您使用时,dynamic您会失去很多编译时类型安全性。我对您收到的确切异常感到有些惊讶(这不是我看到的异常),但我对它编译并不感到惊讶。

请注意,这不是dynamic泛型之间的交互- 使用非泛型方法编译相同的代码:

private static bool IsTrue(object someData)
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)