Во-первых, это сообщение об ошибке было удалено в более поздних версиях C #;команда разработчиков решила, что это создает больше путаницы, чем предотвращенных ошибок.
Проблема заключается в том, что имя Model
здесь используется для обозначения двух вещей: какое свойство или переменная используется в качестве коллекции foreach
и в качестве формального параметра лямбда. Кроме того, два использования перекрываются . То есть Model
, который используется в foreach
, это непосредственно вне использования Model
как формального внутри foreach
. По сути, здесь компилятор говорит: «вы создаете ситуацию, в которой вы, возможно, используете одно и то же имя, чтобы обозначать две совершенно разные вещи рядом друг с другом», и это очень запутанная и подверженная ошибкам ситуация.
(Наличие двух лямбд рядом с друг с другом с одинаковыми именами для формальных параметров не является незаконным, поскольку они не перекрываются . Если бы одна лямбда была в другой, это дало быпохожая ошибка.)
Это сообщение об ошибке является благими намерениями, но, к сожалению, компилятор плохо объясняет проблему пользователю. Я сделал некоторую работу, чтобы улучшить это сообщение об ошибке в ... 2011 году, может быть? Или около того. Но улучшения были в лучшем случае незначительными.
Как вы обнаружили, правильным исправлением является , прекратите использовать одно и то же имя, чтобы обозначить две совершенно разные вещи в одной и той же области действия .