2014-11-01 85 views
0

我對使用dynamic的一些代碼結果感到困惑。將動態投射爲int成功但是'as int?'返回null

我在使用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的情況。

回答

1

考慮此程序:

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 : nulls is int?將返回false有或沒​​有dynamic