微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么将JValue保留在“动态”变量中,该变量可分配给字符串变量,但在调用带有字符串参数的方法时不可用?

这确实来自以下问题:Looping through JSON array and adding items to list 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) { }

我首先想到的是JValuestring一个隐式强制转换运算符,可惜:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。