我对使用dynamic
的一些代码结果感到困惑。
我使用Newtonsoft json.net库在C#中解析一些JSON。 JSON字符串的结尾如下:
}],"Result":{"820":1,"821":1,"822":2,"823":0}}
所以我设置了一个类来包含解析的JSON:
public class Poll
{
public Answer[] Answer { get; set; }
public dynamic Result { get; set; }
}
然后使用此行解析我的JSON字符串
var poll = JsonConvert.DeserializeObject<BallotsharePoll>(json);
然后这段代码深入研究动态对象:
if (poll.Result["820"] != null)
{
var votes = (int)(poll.Result["820"]).Value;
result[i] = votes;
}
这很有效。但我的原始代码使用int?和行
var votes = (poll.Result["820"]).Value as int?;
失败,如观察窗口所示:
这表明
poll.Result["820"]
的动态值为{1}
,(int)(poll.Result["820"]).Value
的值为1
,(poll.Result["820"]).Value as int?
的值为null
问题:为什么as int?
在投放到null
时返回int
会导致1
?
我宁愿使用int?
来涵盖无法将动态值强制转换为int
的情况。
答案 0 :(得分:2)
考虑这个程序:
using System;
static class Program {
static void Main() {
dynamic s = (short)1;
Console.WriteLine(s as int?);
Console.WriteLine((int)s);
}
}
第一个WriteLine
不打印,第二个打印1
。可能,你的案子中的问题是类似的。
这不是直觉行为,我很乐意承认。将as
与dynamic
一起使用时,您获得的内容非常s is int? ? (int?)s : null
,而s is int?
将返回false
,无论是否有dynamic
。
答案 1 :(得分:2)
很抱歉提出了一个非常老的问题,但我知道这种行为背后的答案。
简而言之,关键字“ int?”只是通用类Nullable的快捷方式,通用类型T为Int。
因此,动态的(应视为int?)应该是可空实例。
如果您的Json是
}],"Result":{"820":{"Value":1,"HasValue":true},}}
操作“为int?”本来可以的。