首页 > 解决方案 > 为什么 JValue 保存在“动态”变量中,可分配给字符串变量,但在调用采用字符串参数的方法时不可用?

问题描述

这确实来自这个问题:循环遍历 JSON 数组并将项目添加到列表 C#

为了不完全破坏这个问题,我问了一个我开始想知道的新问题。

使用 Json.net,为什么这段代码有效:

dynamic test = new JValue("test");
string s = test;

而这:

dynamic test = new JValue("test");
var list = new List<string>();
list.Add(test);

抛出:

RuntimeBinderException: ' ' 的最佳重载方法匹配System.Collections.Generic.List<string>.Add(string)有一些无效参数

鉴于该Add方法只有一个重载,并且它需要一个字符串,为什么它不在这里静默地进行运行时转换呢?

请注意,没有什么特别的list.Add原因导致此失败,这也失败了:

dynamic test = new JValue("test");
Test(test);

...

public static void Test(string s) { }

我能想到的第一件事是它JValue有一个隐式转换运算符 to string,但是唉:

JValue test = new JValue("test");
string s = test;

不编译,有:

CS0266 无法将类型“ Newtonsoft.Json.Linq.JValue”隐式转换为“ string”。存在显式转换(您是否缺少演员表?)

但它确实说存在显式转换,这是“保存”直接赋值给string变量的原因吗?但是,为什么不将用法保存为唯一可用的重载采用字符串参数的参数值?分配可能有额外的规则吗?


在对此进行了更多思考之后,我想这个问题实际上是错误的问题

dynamic不应该让更多的东西在运行时工作而不是在编译时工作,相反它只是意味着将类型绑定推迟到运行时。

因此,将变量的类型更改为静态类型,并且两个示例都不起作用:

JValue test = new JValue("test");
string s = test; // CS0266 Cannot implicitly convert type 'Newtonsoft.Json.Linq.JValue' to 'string'. An explicit conversion exists (are you missing a cast?)

JValue test = new JValue("test");
Test(test); // same

标签: c#json.netdynamictype

解决方案


推荐阅读