混淆NullReferenceException

时间:2012-08-08 01:55:46

标签: c# .net wpf nullreferenceexception

我创建了两个组合框,一个用于最小值,另一个用于最大值。我的代码应该确保用户没有选择大于最大值的最小值,或者使用此代码选择小于最小值的最大值。

private void MaxRating_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            switch (MaxRating.SelectedIndex)
            {
                case 0:
                    if (MinRating.SelectedIndex > 0)
                        MinRating.SelectedIndex = 0;
                    break;
                case 1:
                    if (MinRating.SelectedIndex > 1)
                        MinRating.SelectedIndex = 1;
                    break;
                case 2:
                    if (MinRating.SelectedIndex > 2)
                        MinRating.SelectedIndex = 2;
                    break;
                case 3:
                    if (MinRating.SelectedIndex > 3)
                        MinRating.SelectedIndex = 3;
                    break;
                case 4:
                    if (MinRating.SelectedIndex > 4)
                        MinRating.SelectedIndex = 4;
                    break;
            }
        }

然而,在调用“if(MinRating.SelectedIndex> 0)”的行进行调试时,我得到“NullReferenceException未被用户代码处理”。

我不知道为什么,我也有MinRating_SelectionChanged的功能,而且我似乎没有得到那样的东西。

如果我从此函数中删除case:0,则似乎没有错误。不是来自其他功能。我也试过替换>与==但它似乎只是做同样的事情。 任何帮助都会被赞赏,因为我只是感到困惑。

编辑:如果我只是放置这两行

int minrating = MinRating.SelectedIndex;
int maxrating = MaxRating.SelectedIndex;

它在第二行给出错误

3 个答案:

答案 0 :(得分:1)

你能不能这么说?

if (MinRating.SelectedIndex > MaxRating.SelectedIndex)
{
    MinRating.SelectedIndex = MaxRating.SelectedIndex;
}

然后,您不会尝试读取尚未设置的值。它也短得多。

在侧节点上:您不应使用SelectedIndex属性。使用对象的值而不是它们在集合中的位置。

答案 1 :(得分:1)

如果仔细分析,您会看到即使在控件初始化期间也可能会调用此方法,其中MaxRating刚刚构建但MinRating甚至没有构造。在调用此方法时,您不能假设它们都是构造的。

作为解决方法,您可以在此方法的开头检查两者的null。

答案 2 :(得分:-1)

我不熟悉C#,但是当MaxRating.SelectedIndex为null(0等于null)时,可能会执行case 0,因此它使用null MaxRating.SelectedIndex进入大小写。