for循环中的变量无法返回?

时间:2016-08-05 14:03:42

标签: c#

我知道这是非常基本的,但我真的看不出这个代码中的问题在哪里

        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;
    }

编译器将返回变量通知为错误。 我犯了什么错误

2 个答案:

答案 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;
}