将dynamic强制转换为int成功,但';as int?&x27;返回空值

将dynamic强制转换为int成功,但';as int?&x27;返回空值,dynamic,json.net,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; } } 然

我被一些使用
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);
这很有效。但是我的原始代码使用int?线路呢

var votes = (poll.Result["820"]).Value as int?;
如此处的“监视”窗口中所示,该操作失败:

这表明

  • poll.Result[“820”]
    的动态值为
    {1}
  • (int)(poll.Result[“820”])的值是
    1
  • 但是
    (poll.Result[“820”])的值作为int?
    null
问题:为什么
为int?
在强制转换为
int
时返回
null
,导致
1

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

的情况,请考虑以下程序:

using System;
static class Program {
  static void Main()     {
    dynamic s = (short)1;
    Console.WriteLine(s as int?);
    Console.WriteLine((int)s);
  }
}
第一个
WriteLine
不打印任何内容,第二个打印
1
。很可能,您案例中的问题与此类似

我很高兴地承认,这不是直觉行为。当将
作为
动态
一起使用时,您得到的几乎是
s是int?(int?.s:null
,并且
s为int?
将返回
false
,带或不带
dynamic

考虑此程序:

using System;
static class Program {
  static void Main()     {
    dynamic s = (short)1;
    Console.WriteLine(s as int?);
    Console.WriteLine((int)s);
  }
}
第一个
WriteLine
不打印任何内容,第二个打印
1
。很可能,您案例中的问题与此类似


我很高兴地承认,这不是直觉行为。当将
作为
动态
一起使用时,您得到的几乎是
s是int?(int?.s:null
,并且
s为int?
将返回
false
,带或不带
dynamic

很抱歉,我引出了一个非常古老的问题,但我知道这个行为背后的答案

简而言之,关键字“int?”只是泛型类Nullable的快捷方式,泛型类型T为int

因此,一个被视为int?的动态实例应该是一个可为null的实例

如果你的Json是

}],"Result":{"820":{"Value":1,"HasValue":true},}}

“as int?”操作可能会起作用。

很抱歉,我提出了一个非常老的问题,但我知道这个行为背后的答案

简而言之,关键字“int?”只是泛型类Nullable的快捷方式,泛型类型T为int

因此,一个被视为int?的动态实例应该是一个可为null的实例

如果你的Json是

}],"Result":{"820":{"Value":1,"HasValue":true},}}
“as int”操作本可以工作