将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”操作本可以工作