Регулярные выражения. Небольшие проблемы с обработкой коллекции результатов.

Что-то некорректно работает при автоопределении типа (выбирается тип_предок - Object вместо Match), вследствие чего недоступны некоторые поля найденных вхождений Matches с циклом foreach. Если тип задать явно до/внутри foreach, то проблемы нет.

###
uses System.Text.RegularExpressions;
var str:='FTWANFYEBMAXDSILWJQYAMDZPTXYFDPMWATBAVKEVWPTISZTNKNYBUGQMQBLYXYDIBPXKAEXT';

///ТАК НЕ РАБОТАЕТ
  foreach var z in regex.Matches(str,'W.{3}A') do println(z.Index,z.Value);

///ТАК РАБОТАЕТ
  foreach var z:System.Text.RegularExpressions.Match in regex.Matches(str,'W.{3}A') do println(z.Index,z.Value);

///И ТАК РАБОТАЕТ
  //var z:System.Text.RegularExpressions.Match;
  //foreach z in regex.Matches(str,'W.{3}A') do println(z.Index,z.Value);

///И ТАК РАБОТАЕТ
  //var mtc:=regex.Matches(str,'W.{3}A');
  //for var z :=0 to mtc.Count-1 do println(mtc[z].Index,mtc[z].value);

В .Net framework MatchCollection реализует ICollection, но не ICollection<Match>. Глупо - да. Но это не проблема лично компилятора паскаля.

С другой стороны ничего не мешает сделать особую обработку для этого типа в компиляторе - у foreach уже полно таких.

А пока рекомендую использовать один из этих вариантов:

  foreach z: &Match in regex.Matches(str,'W.{3}A') do println(z.Index,z.Value);
  foreach var z in regex.Matches(str,'W.{3}A').Cast&<&Match> do println(z.Index,z.Value);

ну я понимаю, что проблема не самого компилятора, потому что он то,как раз подсказывает что тип будет Match. я даже не уверен, что тему создал для решения проблемы. наверное больше для того чтобы показать возможные варианты обхода проблемы. спасибо за Ваш ответ.

       "Во многих знаниях - многия печали"

Если Вы перестанете в язык тащить конструкции из .NET так, как это было в C#, у Вас уйдут многие проблемы.

##
var str:='FTWANFYEBMAXDSILWJQYAMDZPTXYFDPMWATBAVKEVWPTISZTNKNYBUGQMQBLYXYDIBPXKAEXT';

foreach var z in str.Matches('W.{3}A') do println(z.Index,z.Value)
2 лайка

спасибо.