【问题标题】:Dynamic passed as parameter: return type cannot be inferred [duplicate]作为参数动态传递:无法推断返回类型[重复]
【发布时间】:2020-09-07 20:56:47
【问题描述】:

最近,我遇到了一个关于使用dynamic w 的有趣问题。 当我将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;
    }
}

在上面的代码中,IsTrue 返回一个bool,但response 的类型不会被推断为bool。结果,上述代码编译成功。

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

未处理的异常。 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:运算符“==”不能应用于“布尔”和“字符串”类型的操作数 在 CallSite.Target(闭包,CallSite,对象,字符串) 在 System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,Tret](CallSite 站点,T0 arg0,T1 arg1)

这怎么可能?

【问题讨论】:

  • 有趣,我得到了一个不同的异常:System.Linq.Expressions.dll 中发生了“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的未处理异常无法将类型“bool”隐式转换为'字符串'.

标签: c#


【解决方案1】:

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

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

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

private static bool IsTrue(object someData)
{
    return true;
}

【讨论】:

  • 嗨,乔恩,感谢您的解释。我正在使用 JetBrains 骑手,不确定这是否是导致不同运行时错误的原因。我还更新了我的问题并删除了泛型。
  • @Ankit:好的;以使答案在事后变得不那么有意义的方式来编辑问题通常不是一个很好的举措。我现在无法编辑我的帖子;它必须等到早上,直到那时我似乎完全没有理由谈论泛型。
  • 嗨乔恩,很抱歉,下次我会更加小心。
  • 我还使用dotnet run 通过命令行运行了应用程序,我得到了同样的编译错误。可能是 .NET Core 与 .NET 框架的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
相关资源
最近更新 更多