C# 为什么JValue持有在“a”中;“动态”;变量,可分配给字符串变量,但在调用使用字符串参数的方法时不可用?

C# 为什么JValue持有在“a”中;“动态”;变量,可分配给字符串变量,但在调用使用字符串参数的方法时不可用?,c#,json.net,dynamictype,C#,Json.net,Dynamictype,这真的来自这个问题: 为了不让这个问题彻底出轨,我问了一个我开始怀疑的新问题 使用Json.net,为什么这段代码可以工作: dynamic test = new JValue("test"); string s = test; 而这: dynamic test = new JValue("test"); var list = new List<string>(); list.Add(test); 我能想到的第一件事是,JValue对str

这真的来自这个问题:

为了不让这个问题彻底出轨,我问了一个我开始怀疑的新问题

使用Json.net,为什么这段代码可以工作:

dynamic test = new JValue("test");
string s = test;
而这:

dynamic test = new JValue("test");
var list = new List<string>();
list.Add(test);
我能想到的第一件事是,
JValue
string
有一个隐式强制转换操作符,但遗憾的是:

JValue test = new JValue("test");
string s = test;
不编译,带有:

CS0266无法将类型“
Newtonsoft.Json.Linq.JValue
”隐式转换为“
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

JValue
implements
IConvertible
也许这会让第一个赋值起作用?@GuruStron可能是,我完全理解这里的情况肯定有所不同,我只是想知道为什么
string variable=
起作用而
list.Add()
不起作用,但是我假设字符串分配可能有一些不同的规则。查看反编译的代码,有call
o__0.p__0=CallSite.Create(Microsoft.CSharp.RuntimeBinder.Binder.Convert(CSharpBinderFlags.None,typeof(string),typeof(C))用于分配,而仅用于添加
活页夹。调用成员
。哪一种是有意义的——分析所有可能的重载和转换需要做更多的工作。我越想它,我认为这是一个错误的问题<代码>动态
用于将有效的代码处理推迟到运行时。如果我静态地将它键入
JValue
,它就不会编译,所以我想这可能就是答案。请注意,
JValue
间接地实现了
IDynamicMetaObjectProvider
,这可能就是第一个示例在运行时实际工作的原因。不过,这并不能解释第二个示例在运行时失败的原因。
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