C# 为什么在调用方法时使用json.net和dynamic获得RuntimeBinderException

C# 为什么在调用方法时使用json.net和dynamic获得RuntimeBinderException,c#,dynamic,json.net,C#,Dynamic,Json.net,为什么当我将dynamic与json.net一起使用时,会出现运行时绑定异常,然后调用一个方法而不强制转换,但我可以解决这个问题 private static void Main() { dynamic json = JObject.Parse("{\"Test\":23}"); var t = json.Test; int a = t; //Success Prop = t; //Success Func(t); //RuntimeBinderExcep

为什么当我将dynamic与json.net一起使用时,会出现运行时绑定异常,然后调用一个方法而不强制转换,但我可以解决这个问题

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; }
当我将它转换为正确的类型时,没有错误,但我更希望不必这样做。我是否做错了什么,这是json.net库中的问题还是语言限制

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

私有静态void Func(动态I){


这将解决问题

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

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

如果您想了解更多信息,实际上还有一个更一般的问题和答案:

是的,但是当我无法控制正在调用的方法的签名时,我该怎么办。你能发布完整的异常消息吗?这对我帮助很大。非常感谢你。多么奇怪的行为。。。