2014-12-20 2 views
2

Я пытался итерация через MatchCollection из Regex выражения в пределах foreach цикла, используя ключевое слово var компилятор делает вывод, что глава является объектом, который дает мне ошибку, что Value свойства неизвестно.Почему компилятор не может вывести правильный тип foreach из Regex.Matches?

foreach (var chapter in ChapterExtractor.Matches(page.RawContent)) 
{ 
    chapter.Add(chapter.Value); // Does not compile! 
} 

когда var заменяется Match она прекрасно работает.

foreach (Match chapter in ChapterExtractor.Matches(page.RawContent)) 
{ 
    chapter.Add(chapter.Value); // OK! 
} 

Пример, представленный на MSDN (http://msdn.microsoft.com/pt-br/library/system.text.regularexpressions.matchcollection(v=vs.110).aspx) также использует Match класс в цикле foreach.

Но, не должен ли компилятор, что chapter имеет тип Match вместо object? Итак, кажется, что компилятор неявно выполняет листинг с object до Match. Это правда?

ответ

5

Но не должен ли компилятор заключить, что chap имеет тип Match вместо объекта?

Matches возвращает MatchCollection, который не является универсальным, это метод Перечислитель возвращает object. Таким образом, компилятор не может вывести тип. Он работает, когда вы используете Match, потому что базовые элементы: Match, и поэтому он не сбой с InvalidCastException.

Итак, кажется, что компилятор неявно выполняет приведение объекта из объекта в соответствие. Это правда?

Да, это правда.

2

В цикле foreach компилятор использует интерфейс IEnumerable или общий интерфейс IEnumerable<T> объекта, который вы зацикливаете. Поскольку класс MatchCollection имеет только интерфейс IEnumerable

public class MatchCollection : ICollection, IEnumerable 

компилятор использует

public IEnumerator GetEnumerator(); 

, который в свою очередь, дает ток типа 'объекта'

public interface IEnumerator 
{ 
    object Current { get; } 
} 
Смежные вопросы