这确实来自这个问题:循环遍历 JSON 数组并将项目添加到列表 C# https://stackoverflow.com/questions/64483744/looping-through-json-array-and-adding-items-to-list-c-sharp.
为了不完全偏离这个问题,我问了一个我开始想知道的新问题。
使用 Json.net,为什么这段代码可以工作:
dynamic test = new JValue("test");
string s = test;
而这个:
dynamic test = new JValue("test");
var list = new List<string>();
list.Add(test);
throws:
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
有一个隐式转换运算符string
, 可惜:
JValue test = new JValue("test");
string s = test;
无法编译,具有:
CS0266 无法隐式转换类型 'Newtonsoft.Json.Linq.JValue
' to 'string
'。存在显式转换(您是否缺少强制转换?)
但它确实说存在显式转换,这就是“保存”对 a 的直接分配的原因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