C# 为什么JValue持有在“a”中;“动态”;变量,可分配给字符串变量,但在调用使用字符串参数的方法时不可用?
这真的来自这个问题: 为了不让这个问题彻底出轨,我问了一个我开始怀疑的新问题 使用Json.net,为什么这段代码可以工作: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
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
implementsIConvertible
也许这会让第一个赋值起作用?@GuruStron可能是,我完全理解这里的情况肯定有所不同,我只是想知道为什么string variable=
起作用而list.Add()
不起作用,但是我假设字符串分配可能有一些不同的规则。查看反编译的代码,有callo__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