将动态转换为int成功但是作为int?'返回null

时间:2014-11-01 16:09:27

标签: dynamic json.net

我对使用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?;

失败,如观察窗口所示:

VS2013 watch window screenshot

这表明

  • poll.Result["820"]的动态值为{1}
  • (int)(poll.Result["820"]).Value的值为1
  • (poll.Result["820"]).Value as int?的值为null

问题:为什么as int?在投放到null时返回int会导致1

我宁愿使用int?来涵盖无法将动态值强制转换为int的情况。

2 个答案:

答案 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。可能,你的案子中的问题是类似的。

这不是直觉行为,我很乐意承认。将asdynamic一起使用时,您获得的内容非常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?”本来可以的。