Почему foreach var в EventLogEntryCollection не возвращает EventLogEntry? - PullRequest
0 голосов
/ 15 апреля 2019

Я исследовал IEnumerable и IEnumerator. Существует много способов, как сделать класс пригодным для использования в выражении foreach. Но это не отвечает на мой вопрос. Почему EventLogEntryCollection, используемый в цикле foreach, не возвращает EventLogEntry? Но если я изменил var на EventLogEntry, он будет работать так, как я ожидал, используя цикл for.

       EventLog eventLog1 = new EventLog
        {
            Log = myLogName,
            Source = "sourcy"
        };

        EventLogEntryCollection collection = eventLog1.Entries;
        eventLog1.Close();

        foreach (var v in collection)
        {
            Console.WriteLine(v.Message); //object does not contain definition for Message

        }

        for (int i = 0; i < collection.Count; i++)
        {
            Console.WriteLine("The Message of the EventLog is :"
               + collection[i].Message);
        }

1 Ответ

3 голосов
/ 15 апреля 2019

Почему EventLogEntryCollection, используемый в цикле foreach, не возвращает EventLogEntry?

Потому что это старый код, пре-дженерики. Он просто реализует ICollection, который наследует неуниверсальный IEnumerable.GetEnumerator() метод , используемый вашим foreach() циклом.

Таким образом, тип элемента этого перечислителя - object, и он не содержит свойства Message.

Но если я изменил var на EventLogEntry, он будет работать так, как я ожидал, используя цикл for.

Это именно то, что вам нужно сделать, чтобы это исправить.

См. Также Тип объекта не распознается в цикле foreach .

...