#c_sharp
У меня 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
Почему в 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
Комментариев нет:
Отправить комментарий