我知道这是非常基本的,但我真的看不出这个代码中的问题在哪里
private int Linesel(List<GraphicsPath> LineGroup)
{
int selectedline;
for (int i =0; i < LineGroup.Count; i++)
{
Pen pen = new Pen(Color.Navy, 8);
if (LineGroup[i].IsOutlineVisible(Latest, pen))
{
selectedline = i;
}
else if (!LineGroup[i].IsOutlineVisible(Latest, pen))
{
selectedline = -1;
}
}
return selectedline;
}
编译器将返回变量通知为错误。 我犯了什么错误
答案 0 :(得分:1)
您遇到的问题是,当您的for循环没有迭代(LineGroup.Count == 0)时,selectedline
没有值。编译器你可以用:
int selectedline = default(int);
像Scott所说,0
也是一个有效的值。你可以用两种方式解决它。
返回无效但可检测的值。
private int Linesel(List<GraphicsPath> LineGroup)
{
for (int i =0; i < LineGroup.Count; i++)
{
Pen pen = new Pen(Color.Navy, 8);
if (LineGroup[i].IsOutlineVisible(Latest, pen))
{
return i;
}
}
return -1;
}
或强>
private int? Linesel(List<GraphicsPath> LineGroup)
{
for (int i =0; i < LineGroup.Count; i++)
{
Pen pen = new Pen(Color.Navy, 8);
if (LineGroup[i].IsOutlineVisible(Latest, pen))
{
return i;
}
}
return null;
}
使用它像:
var res = Linesel(....);
if(!res.HasValue)
{
// problem
}
else
{
// -> res.Value;
}
提出异常
private int Linesel(List<GraphicsPath> LineGroup)
{
for (int i =0; i < LineGroup.Count; i++)
{
Pen pen = new Pen(Color.Navy, 8);
if (LineGroup[i].IsOutlineVisible(Latest, pen))
{
return i;
}
}
throw new Exception("WHATEVER"); // <-- you might create your own
}
答案 1 :(得分:0)
如果selectedline
集合中没有项目,则可以在不设置LineGroup
值的情况下执行该代码。
此外,对于if ()
和else if()
块,编译器不够聪明,不能知道else if()
块的条件与原始if ()
块的条件相反。 1}}阻塞,因此即使您在集合中有项目,编译器也无法确定您是否会遇到任何一个赋值语句。对于人类程序员来说,这可能是显而易见的,但编译器的工作方式并不相同。最好只在这里做else
而不是让cpu重新测试条件。
此代码应该更接近您的预期:
private int Linesel(List<GraphicsPath> LineGroup)
{
int selectedline = -1;
Pen pen = new Pen(Color.Navy, 8);
for (int i =0; i < LineGroup.Count; i++)
{
selectedline = LineGroup[i].IsOutlineVisible(Latest, pen)?i:-1;
}
return selectedline;
}
最后,您了解到只有LineGroup
的最后一个元素对此代码非常重要,对吗?组中可能有多行,但只返回一个整数。代码检查所有行,并每次设置selectedline
,但只有selectedline
的 final 值返回给调用者。如果这真的是你想要的,那就这样吧,但如果是这样的话,你应该使用更像这样的代码:
private int Linesel(List<GraphicsPath> LineGroup)
{
int last = LineGroup.Count -1;
Pen pen = new Pen(Color.Navy, 8);
return LineGroup[last].IsOutlineVisible(Latest, pen)?last:-1;
}
试着猜测你的真实意图,我能做的最好的就是你想知道实际可见的最后一行。在这种情况下,完全避免使用其他:
private int Linesel(List<GraphicsPath> LineGroup)
{
int selectedline = -1;
Pen pen = new Pen(Color.Navy, 8);
for (int i =0; i < LineGroup.Count; i++)
{
if (LineGroup[i].IsOutlineVisible(Latest, pen))
selectedline = i;
}
return selectedline;
}