Почему foreach выполняет итерации со ссылкой константы?

Здесь - проблема в codeplex , объясняющая, почему возникает эта ошибка.

Цитата из http://web.archive.org/web/20131004122626/http://aspnet.codeplex.com/workitem/1795 , так как исходная ссылка не работает:

Атрибут HandleError не должен хранить информацию об исключении в ViewData.

Когда атрибут HandleError обрабатывает исключение, он сохраняет информацию об исключении в ViewData. Это проблема, когда Error.aspx наследуется от site.master, а класс site.master объявляется следующим образом.

public partial class Site : System.Web.Mvc.ViewMasterPage
{
}

SiteViewData содержит:

public class SiteViewData 
{
  public String Title { get; set; } 
}

Каждый класс страницы ViewData наследуется от класса SiteViewData и выглядит примерно так

public class IndexViewData : SiteViewData
{
  public String Message { get; set; }
  public String SupportedLanguages {get; set;}
}

Этот подход позволяет написать код на странице Site.Master следующим образом

<%= Html.Encode(ViewData.Model.Title) %>

К сожалению, когда выдается исключение, модель заменяется экземпляром класса HandleErrorInfo. Это вызывает выброс InvalidOperationException с информацией

Элемент модели, переданный в словарь, имеет тип System.Web.Mvc.HandleErrorInfo, но для этого словаря требуется элемент модели типа Igwt.Boh.Website.Web.Controllers.SiteViewData.

Можно ли добавить новое свойство ErrorData в класс ViewResult для хранения экземпляра класса HandleErrorInfo? Таким образом, ViewData не меняется.

Вполне вероятно, что любое исключение, возникшее в действии, произойдет после того, как свойства IndexViewDataSiteViewData) уже были инициализированы.

Закрыто 27 января 2010 в 00:24 по

Не исправлю - см. Комментарии.


Комментарии, упомянутые с помощью «wontfix», принадлежат бывшему члену команды Microsoft вместе с предложением обойти это (выделено жирным шрифтом):

К тому времени выполняется атрибут [HandleError], мы потеряли ссылку на исходный объект ActionResult. Мы даже не знаем, намеревались ли вы показать представление в любом случае - возможно, вы намеревались перенаправить. Часть конвейера (ViewResult), которая отвечала бы за передачу модели из контроллера в представление, исчезла.

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

[Тысяча сто двадцать семь]

11
задан ymoreau 24 August 2017 в 13:26
поделиться

4 ответа

As explained on the Qt Generic Containers Documentation:

Qt automatically takes a copy of the container when it enters a foreach loop. If you modify the container as you are iterating, that won't affect the loop. (If you don't modify the container, the copy still takes place, but thanks to implicit sharing copying a container is very fast.) Similarly, declaring the variable to be a non-const reference, in order to modify the current item in the list will not work either.

It makes a copy because you might want to remove an item from the list or add items while you are looping for example. The downside is that your use case will not work. You will have to iterate over the list instead:

for (QList<QString>::iterator i = a.begin(); i != a.end(); ++i) { 
  (*i) += "s";
} 

A little more typing, but not too much more.

21
ответ дан 3 December 2019 в 02:40
поделиться

or you can use

QList<QString> a;
BOOST_FOREACH(QString& s, a)
{
   s += "s";
}
5
ответ дан 3 December 2019 в 02:40
поделиться

I believe Qt's foreach takes a temporary copy of the original collection before iterating over it, therefore it wouldn't make any sense to have a non-const reference as modifying the temporary copy it would have no effect.

2
ответ дан 3 December 2019 в 02:40
поделиться

Maybe for your case:

namespace bl = boost::lambda;
std::for_each(a.begin(),a.end(),bl::_1 += "s");
2
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: