Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#使用Newtonsoft.Json反序列化时显式强制转换动态对象值_C#_.net_Json.net - Fatal编程技术网

c#使用Newtonsoft.Json反序列化时显式强制转换动态对象值

c#使用Newtonsoft.Json反序列化时显式强制转换动态对象值,c#,.net,json.net,C#,.net,Json.net,我想了解这里发生了什么。我正在用NewtonSoft.JSON反序列化JSON响应 我注意到我显式地需要强制转换这个动态类型的属性,以便对它们进行解释 例如: [Test] public void Test() { var a = JsonConvert.DeserializeObject<dynamic>("{ 'Amount': '123.0' }"); Assert.AreEqual((decimal?)a.Amount, 123m); //PASS

我想了解这里发生了什么。我正在用NewtonSoft.JSON反序列化JSON响应

我注意到我显式地需要强制转换这个动态类型的属性,以便对它们进行解释

例如:

[Test]
public void Test()
{
    var a = JsonConvert.DeserializeObject<dynamic>("{ 'Amount': '123.0' }");

    Assert.AreEqual((decimal?)a.Amount, 123m);  //PASS
    Assert.AreEqual(a.Amount, 123m);            //FAIL
}
[测试]
公开无效测试()
{
var a=JsonConvert.DeserializeObject(“{'Amount':'123.0'}”);
Assert.AreEqual((十进制?)a.Amount,123m);//通过
Assert.AreEqual(a.Amount,123m);//失败
}
我很想知道为什么会这样


这是使用动态对象的本质。如果没有强制转换,编译器将不知道在运行时如何比较这两个对象。相关但不完全相同:。基本上,
a.Amount
是一个
JValue
,并且
JValue
具有内置的动态支持,使显式强制转换到
(十进制?
起作用。这是使用动态对象的本质。如果没有强制转换,编译器将不知道在运行时如何比较这两个对象。相关但不完全相同:。基本上,
a.Amount
是一个
JValue
并且
JValue
具有内置的动态支持,可以显式转换为
(十进制?
)。