Ошибка: локальная переменная с именем «Модель» не может быть объявлена ​​в этой области - PullRequest
1 голос
/ 21 октября 2019

Я возвращаю список в представление. Таким образом, модель IEnumerable. Он отлично работает в цикле foreach, чтобы получить сотрудников. Но когда я использую эту Модель внутри цикла, она выдает мне ошибку:

Локальная переменная с именем «Модель» не может быть объявлена ​​в этой области, потому что она придала бы другое значение «Модели», чтоуже используется в родительской или текущей области для обозначения чего-то еще.

Внутри цикла, когда я использую другое имя, отличное от Model, оно работает нормально.

View @model IEnumerable

@foreach (tbEmployee emp in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(Model => emp.empID)
            </td>
            <td>
                @Html.DisplayFor(Model  => emp.empName)
            </td>
            <td>
                @Html.DisplayFor(Model  => emp.empAge)
            </td>
            <td>
                @Html.DisplayFor(Model  => emp.empStatus)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", "Employee")
                @Html.ActionLink("Update", "Update", "Employee")
                @Html.ActionLink("Delete", "Delete", "Employee")
            </td>
        </tr>
    }

Но когда я пишу как, этоотлично работает

 @foreach (tbEmployee emp in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(x => emp.empID) //where this x get data from
            </td>
            <td>
                @Html.DisplayFor(x => emp.empName)
            </td>
            <td>
                @Html.DisplayFor(x => emp.empAge)
            </td>
            <td>
                @Html.DisplayFor(x => emp.empStatus)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", "Employee")
                @Html.ActionLink("Update", "Update", "Employee")
                @Html.ActionLink("Delete", "Delete", "Employee")
            </td>
        </tr>
    }

1 Ответ

4 голосов
/ 21 октября 2019

Во-первых, это сообщение об ошибке было удалено в более поздних версиях C #;команда разработчиков решила, что это создает больше путаницы, чем предотвращенных ошибок.

Проблема заключается в том, что имя Model здесь используется для обозначения двух вещей: какое свойство или переменная используется в качестве коллекции foreachи в качестве формального параметра лямбда. Кроме того, два использования перекрываются . То есть Model, который используется в foreach, это непосредственно вне использования Model как формального внутри foreach. По сути, здесь компилятор говорит: «вы создаете ситуацию, в которой вы, возможно, используете одно и то же имя, чтобы обозначать две совершенно разные вещи рядом друг с другом», и это очень запутанная и подверженная ошибкам ситуация.

(Наличие двух лямбд рядом с друг с другом с одинаковыми именами для формальных параметров не является незаконным, поскольку они не перекрываются . Если бы одна лямбда была в другой, это дало быпохожая ошибка.)

Это сообщение об ошибке является благими намерениями, но, к сожалению, компилятор плохо объясняет проблему пользователю. Я сделал некоторую работу, чтобы улучшить это сообщение об ошибке в ... 2011 году, может быть? Или около того. Но улучшения были в лучшем случае незначительными.

Как вы обнаружили, правильным исправлением является , прекратите использовать одно и то же имя, чтобы обозначить две совершенно разные вещи в одной и той же области действия .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...