Разница в поведении бокса в System.Dynamic.ExpandoObject

Недавно я начал программировать на C# и писать приложения ASP.NET MVC. Я делал что-то похожее на это:

var hashtable =  new Hashtable();
hashtable.Add("First", 12);
hashtable.Add("Second", 12);

if(hashtable["First"] == hashtable["Second"])
{
    Console.WriteLine("Equal");
}
else{
    Console.WriteLine("Not Equal");
}

Он всегда выводит Not Equal. Через некоторое время я понял, что это был эффект бокса. Однако, если я напишу следующее:

var hashtable =  new Hashtable();
hashtable.Add("First", 12);
hashtable.Add("Second", 12);

dynamic ViewBag = new System.Dynamic.ExpandoObject();
ViewBag.hashtable = hashtable;

if(ViewBag.hashtable["First"] == ViewBag.hashtable["Second"])
{
    Console.WriteLine("Equal");
}
else
{
    Console.WriteLine("Not Equal");
}

Он всегда выводит Equal.

Каков основной механизм, вызывающий эту разницу?


person foresightyj    schedule 11.12.2014    source источник
comment
Равенство сложно. Это может вам помочь. stackoverflow.com/questions/21273890/   -  person Adrian Nasui    schedule 11.12.2014
comment
@AdrianNasui Спасибо, но я думаю, что ссылка, на которую вы ссылаетесь, представляет собой проблему другого рода. Мое замешательство связано не с равенством ссылок и равенством значений или неявным приведением short к int, а с тем, что вызывает автоматическую распаковку ViewBag.hashtable["First"], в то время как hashtable["First"] все еще находится в упаковке.   -  person foresightyj    schedule 11.12.2014
comment
Извините, я немного подумал и понял, что ваш вопрос не о равенстве ссылок. Хороший вопрос жду ответа.   -  person Adrian Nasui    schedule 11.12.2014