Страницы

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

вторник, 10 декабря 2019 г.

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

#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

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

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