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

2024-04-21

这确实来自这个问题:循环遍历 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

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 JValue 保存在“动态”变量中,可分配给字符串变量,但在调用采用字符串参数的方法时不可用? 的相关文章

随机推荐