功能错误:并非所有代码路径返回值



请帮助。我是C#的居民,但以前曾在Python进行编程。我的问题是,它们是一个错误,上面是"严重性"。请提供帮助,我包含一个返回值,并使用了if和其他语句。

using System;
namespace helloworld
{
    class Program
    {
        static void Main(string[] args)
        {
        }

        float Sqrt(int x)
        {

            Console.WriteLine("please enter your number to be square rooted");
            string l = Console.ReadLine();
            x = Convert.ToInt32(l);
            float num = 1;
            if (num * num != x)
            {
                num++;
            }
            if (num * num == x)
            {
                return num;
            }
            else
            {
                Console.WriteLine("FAILED TO EXECUTE");
            }
        } 
    }
}

所以这只是C#基础知识 - 好..编程基础...如果将方法声明为"返回值类型"以外的void,则希望您在某个阶段使用关键字"返回"。

您创建了一种称为:

的方法
float Sqrt(int x)

这表明它必须返回浮点值。

我可以看到在某些情况下(如果语句(,您正在做

return num;

但要仔细地看。在另一个if语句中,没有返回语句 - 因此,基本上,在其他语句中,它将被卡住。

为了确保您的方法不会被卡住 - 您应该确保它具有返回有效值或引发异常的可能性。

if (num * num == x)
            {
                return num;
            }
            else
            {
                throw new Exception("Unable to execute");
            }

您收到的编译器错误的最重要部分是,具有声明的返回类型的方法必须始终返回该类型的值或丢弃错误。

让我们看一下:

float Sqrt(int x)
{
    // Your code here
} 

我们刚刚完成的工作是一种称为Sqrt的方法,该方法接受一个称为xint参数。通过在方法开头使用float类型,我们指出此方法始终返回float。

在您的方法主体中,您必须返回浮子或丢弃错误。让我们看一个简单的情况。

float Sqrt(int x)
{
    if (x > 0)
    {
        // Calculate square root
        return Math.Sqrt(x);
    }
    else
    {
        // Ignore imaginary numbers for now, use absolute value
        return Math.Sqrt(Math.Abs(x));
    }
}

上面的代码工作是因为ifelse都返回有效的值。您的代码失败了,因为您的其他任何东西都没有返回任何内容;请参阅此简化的示例:

float Sqrt(int x)
{
    if (x > 0)
    {
        // Calculate square root
        return Math.Sqrt(x);
    }
    else
    {
        // Ignore imaginary numbers for now, use absolute value
        Console.WriteLine("Don't do that!");
        // Note there is no return statement here
    }
}

上面的示例失败,因为else不返回任何内容,也不会引发异常。交付这一点的另一种方法是提出适当的例外:

float Sqrt(int x)
{
    if (x > 0)
    {
        // Calculate square root
        return Math.Sqrt(x);
    }
    else
    {
        // Ignore imaginary numbers for now, use absolute value
        throw new System.ArgumentException("x must be greater than 0");
    }
}

上面的示例假定您的代码知道如何处理异常。在if else部分中,您可以执行逻辑,但必须返回float值或throw的例外。

正如该错误清楚地说明的,并非所有代码路径返回一个值,这将引发异常。

if (num * num == x)
{
    return num; //Okay
}
else
{
    Console.WriteLine("FAILED TO EXECUTE");
    //returns nothing here
}

要解决此问题,只需在Console.WriteLine之后添加return语句,如果以前的条件失败,请返回您想要的内容。

.net编译器期望在函数的所有可能方案中返回语句。如果代码失败,则返回编译错误。

您可以在其他块中返回某些错误或不可能的值。由于在您的代码中,否则没有返回任何值/异常,因此会出现错误。

最新更新