为什么在调用方法时将json.net与dynamic一起使用时出现RuntimeBinderException

Gli*_*tch 5 c# dynamic json.net

为什么当我在json.net中使用dynamic时,出现运行时绑定异常,然后调用方法而不进行转换,但是我可以进行赋值就没有问题

private static void Main()
{
    dynamic json = JObject.Parse("{\"Test\":23}");
    var t = json.Test;
    int a = t; //Success
    Prop = t; //Success
    Func(t); //RuntimeBinderException
}

private static void Func(int i){}

private static int Prop { get; set; }
Run Code Online (Sandbox Code Playgroud)

当我将其强制转换为正确的类型时,没有错误,但我希望不必这样做。我在做错什么吗,这是json.net库中的问题还是语言限制?

编辑:这是为了解决一个我无法控制方法签名并且不想在每次调用时都将其强制转换的问题。

jbt*_*ule 5

这是因为json.Test返回,JValue并且JValue具有动态TryConvert。因此,如果通过将其指向an int或强制转换为an进行隐式静态转换,int则会在运行时调用该转换,TryConvert并且您会成功。但是,如果在方法参数中使用该动态类型化的变量,则c#运行时会寻找一个以Func与“ JValue”最匹配的参数命名的方法,它将不会尝试对可能方法的每个排列调用“ TryConvert”(即使只有一个),因此您会获得运行时绑定错误。

因此,最简单的解决方案是仅在每次调用时强制转换,或在每次要将a JValue作为参数传递时设置一个静态类型的变量。

如果您要查找更多信息,实际上实际上也有一个更一般的问题和相同问题的答案: 在C#4的方法的静态参数中传递动态变量。