为什么CodeContracts在foreach循环中推荐空检查

时间:2013-06-12 20:39:13

标签: c# code-contracts

我有这段代码:

foreach (UIElement uiElement in list)
{
    uiElement.SetValue(Grid.ColumnProperty, colunmn++);
    uiElement.SetValue(Grid.RowProperty, _uiRoot.RowDefinitions.Count - 1);
    _uiRoot.Children.Add(uiElement);
}

它运行正常,但Code Contracts给了我一个警告:可能在空引用上调用一个方法,uiElement。

uiElement怎么可能为空?该列表是List UIElement,因此它应该遍历列表而不会出现任何空值。

2 个答案:

答案 0 :(得分:2)

因为您可以在列表中放置空值,即使您可能不会

你可以做到

foreach (UIElement uiElement in list.Where(e => e != null))
{
   uiElement.SetValue(Grid.ColumnProperty, colunmn++);
   uiElement.SetValue(Grid.RowProperty, _uiRoot.RowDefinitions.Count -1);
   _uiRoot.Children.Add(uiElement);
}

答案 1 :(得分:1)

列表可以包含空引用。您可以将null插入列表中。您还可以在列表中插入一个好的引用,然后将其设置为null。 例如,如果我有一个People列表,我可以列出: “鲍勃”,“弗雷德”。 现在我从列表中抓取Bob,做一些事情,并将其更改为null。 列表包含引用列表而不是项目。所以它指向项目所在的位置。现在,当您遍历列表时,位置0现在为空,因为Bob现在包含空值的引用。