Страницы

Поиск по вопросам

вторник, 23 октября 2018 г.

Различие между использованием var и dynamic в foreach

У меня 2 вопроса:
1) Почему в 1-м foreach на переменной name недоступны члены DictionaryEntry(например, name.Value),ведь она принадлежит(или как правильно сказать) типу DictionaryEntry,а во 2-м foreach-всё good?
static void Main() { var emailLookup = new Hashtable();
emailLookup["sbishop@contoso.com"] = "Bishop, Scott"; emailLookup["chess@contoso.com"] = "Hell, Christian"; emailLookup["djump@contoso.com"] = "Jump, Dan";
foreach (var name in emailLookup) { Console.WriteLine(name); }
Console.WriteLine(new string('-', 20));
foreach (DictionaryEntry name in emailLookup) { Console.WriteLine(name); }
Console.WriteLine(new string('-', 20));
foreach (object name in emailLookup.Values) { Console.WriteLine(name); }
// Delay. Console.ReadKey(); }
2) Почему в нижеприведённом примере,в foreach при использовании var - нет доступа к Key и Value,а при использовании dynamic - есть?
class UserCollection { public static IEnumerable Generator() { yield return new { Key = 0, Value = "Zero" }; yield return new { Key = 1, Value = "One" }; yield return new { Key = 2, Value = "Two" }; } }
class Program { static void Main() { foreach (var item in UserCollection.Generator()) { Console.WriteLine("Key = {0}, Value = {1}", item.Key, item.Value); }
// Delay. Console.ReadKey(); } }


Ответ

Почему в 1-м foreach на переменной name недоступны члены DictionaryEntry(например,name.Value)
Потому что в этом случае name это DictionaryEntry упакованный в object. И так как у object нет свойств key, value они и недоступны.
Во втором foreach - происходит явное приведение к DictionaryEntry, поэтому name не упакованный объект, а непосредственно структура, с нужными полями.
Почему в нижеприведённом примере,в foreach при использовании var-нет доступа к Key и Value
Потому что из функции возвращается IEnumerable - это нетипизированная коллекция и item опять является упакованным в object
С dynamic это работает потому, что проверка на существование свойств происходит не во время компиляции, а во время выполнения, так как реально возвращается объект с нужными полями, ошибки не возникает.
Больше про упаковку можно прочитать в MSDN: Упаковка-преобразование и распаковка-преобразование Больше про использования dynamic можно прочитать в MSDN: Использование типа dynamic

Комментариев нет:

Отправить комментарий