c# - 为什么 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
解决方案
推荐阅读
- java - 流无法解析为类型
- ios - 在 XNU 内核上找到某个函数的指针的最佳方法是什么?
- bash - 如果 python 脚本在 2 分钟内没有向终端输出任何内容,我想终止它
- c++ - 没有虚函数的类的多态性?
- android - 需要一个圆形图像按钮,将图像剪辑成一个圆圈
- javascript - 什么是编写实时文本搜索和突出显示功能的足够好的方法,它不会破坏文本和元素节点的顺序
- html - 使用 href 属性从 HTML 文件打开时,Django URL 未在浏览器中加载响应
- oauth - 如何将 OAuthCard 的“登录”按钮的行为更改为仅打开 URL 而无需重定向
- r - 将 Google 字体与 R 的 Reactable 表一起使用
- python-3.x - 拒绝执行内联事件处理程序,因为它违反了以下内容安全策略指令:“script-src 'strict-dynamic'