C# 混淆NullReferenceException
我创建了两个组合框,一个用于最小值,另一个用于最大值。我的代码应该确保用户使用此代码时没有选择大于最大值的最小值或小于最小值的最大值C# 混淆NullReferenceException,c#,.net,wpf,nullreferenceexception,C#,.net,Wpf,Nullreferenceexception,我创建了两个组合框,一个用于最小值,另一个用于最大值。我的代码应该确保用户使用此代码时没有选择大于最大值的最小值或小于最小值的最大值 private void MaxRating_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (MaxRating.SelectedIndex) { case 0:
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的行上进行调试时,用户代码未处理I get NullReferenceException
我不知道为什么,我还有一个MinRating_SelectionChanged的函数,我似乎没有得到任何类似的东西
如果我从此函数中删除case:0,则似乎没有错误。也不是来自另一个函数。我还试着用==替换>,但它似乎做了同样的事情。
任何帮助都会被感激的,因为我只是感到困惑
编辑:如果我只放置这两行
int minrating = MinRating.SelectedIndex;
int maxrating = MaxRating.SelectedIndex;
它在第二行给出了错误我对C没有太多经验,但是当MaxRating.SelectedIndex为null时,可能会执行case 0,0相当于null,因此它输入的case是null MaxRating.SelectedIndex。你不能这样说吗
if (MinRating.SelectedIndex > MaxRating.SelectedIndex)
{
MinRating.SelectedIndex = MaxRating.SelectedIndex;
}
然后,您不会尝试读取尚未设置的值。而且它要短得多
在侧节点上:不应使用SelectedIndex属性。使用对象的值,而不是对象在集合中的位置。如果仔细分析,您会发现即使在控件初始化期间也可能调用此方法,其中MaxRating刚刚构建,而MinRating甚至没有构建。调用此方法时,不能假定它们都是构造的
作为一种解决方法,您可以在这个方法的开头检查这两个异常是否为null。您可以将整个异常文本放入问题中吗?请解决这个问题后,您还可以将代码简化为一行:MinRating.SelectedIndex=Math.MinMinRating.SelectedIndex,MaxRating.SelectedIndex;在引发异常的行中添加断点,并检查表达式的每个部分是否存在与编辑相关的空引用:这意味着没有为MaxRating选择索引。您正在询问尚未进行的选择的结果。SelectedIndex的可能重复项为int ValueType not nullable valueThat。。会容易得多是的。。更清楚的是。。而且在各方面都更好。。但是我仍然有一个错误,那就是只有当你在MaxRating中选择了一个项目时,这个错误才会起作用。创建两个控件后手动注册SelectionChanged事件,或者确保在创建两个控件之前不填充控件。在后一种情况下,在选择一个元素之前,您还必须考虑到所有元素都必须在控件中。是的,这似乎就是问题所在!通过在MinRating和MaxRating上放置一个已加载的事件,并创建两个布尔MinRatingControlLoaded和MaxRatingControlLoaded,并在尝试执行代码之前为这两个布尔添加一个if语句,修复了此问题,谢谢!