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