Program.Mattor(): 不是所有的代码路径 return 一个值。我该如何解决这个问题?

Program.Mattor(): not all code paths return a value. How do I solve this?

class Program
{
    static void Main(string[] args)
    {
        /// </summary>
        /// Tapet:

        // Följande ska användaren kunna mata in:
        // 1. Väggens mått: Längd och bredd.
        // 2. Jämförelse av upp till 8 st tapeter.

        // Programmet ska även kunna skriva ut en lista av alla tapet där man tydligt ser namn, antal rullar och pris. 

        //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        ///Mattor:

        // Användaren ska kunna mata in golvets bredd och längd.

        // Användaren ska sedan kunna mata in olika areor på mattor tills det täcker golvets yta.  

        // Vi ska bestämma när antalet mattor har täckt golvet, samt hur många mattor det tog.

        //.......

        // Variabeln menyKörs sätts till true så vi kan skapa en While-loop som hela tiden körs om. Detta avbryter vi genom att sätta den till
        // false ifall användaren väljer att avsluta programmet. 
        bool menyKörs = true;
        while (menyKörs)
        {
            //Ett programm som hjälper anändaren att tappetsera en vägg eller lägga mattor på användarens golv

            Console.WriteLine("Hej! Välkommen till programmet som hjälper dig med att tappetsera och lägga golvmattor ");
            // Menyval för användaren att välja väg i programmet. Beroende på val skickas användaren till olika metoder som utreder specifika uppgifter. 

            Console.WriteLine("Meny: ");
            Console.WriteLine("Välj V för att tappetsera en vägg, M för att lägga mattor eller A för att avsluta programmet! ");
            Console.WriteLine("Tappetsera vägg (V)");
            Console.WriteLine("Lägga mattor (M)");
            Console.WriteLine("Avsluta programm (A)");
            Console.WriteLine("\r\n:");

            string val = Console.ReadLine().ToUpper();

            //Anänver mig av en "switch" för att gå olika vägar beroende på användarens val i menyn. 
            switch (val)
            {
                //Tar in värdena bredd och längd och skickar in detta i metoden "tapeter".
                case "V":
                    {
                        Console.WriteLine("Vad är måtten på väggen du ska tappetsera? (Skriv i meter) ");
                        Console.WriteLine("Bredden: ");
                        double måttBredd = double.Parse(Console.ReadLine());
                        Console.WriteLine("Längden: ");
                        double måttLängd = double.Parse(Console.ReadLine());
                        Console.WriteLine($"Din area på väggen blir: {måttBredd * måttLängd}m^2 ");

                        Tapeter(måttBredd, måttLängd);
                        break;
                    }

                //Skickas direkt till metoden "mattor" som sedan returnar hur många mattor det krävdens
                case "M":
                    {
                        Console.WriteLine($"Det krävdes {Mattor()} antal mattor för att täcka golvets yta! ");
                        break;
                    }
                case "A":
                    {
                        menyKörs = false;
                        break;
                    }

                //Avbryter koden genom att skickas till metoden "Felmeddelande"
                default:
                    {
                        Felmeddelande();
                        break;
                    }

            }

        }

    }

    /// <summary>
    /// En metod som berättar för användaren att ett felaktigt värde blivit angivet. Detta görs i en metod då vi minskar upprepning. 
    /// </summary>
    private static void Felmeddelande()
    {
        Console.WriteLine("Du skrev in ett felaktigt värde, testa igen! ");
    }

    /// <summary>
    /// Räknar ut antal tapeter för en vägg och skriver ut dem
    /// </summary>
    /// <param name="måttBredd">Den bredd väggen har</param>
    /// <param name="måttLängd">Den längd som väggen har</param>
    private static void Tapeter(double måttBredd, double måttLängd)
    {
        //Tapet
        //Olika lister där inmatning utav olika värden från användaren sparas för senare utskrivning
        List<int> listaTapet = new List<int>();
        List<string> listaNamn = new List<string>();
        List<double> listaPris = new List<double>();
        List<double> listaPrisTotal = new List<double>();


        int a = 0;
        bool tapetVäg = true;
        while (a <= 9 && tapetVäg)
        {
            //Menyval där användaren kan välja att lägga till en tapet för jämförelse, skriva ut tapeterna eller avsluta programmet. 
            Console.WriteLine("Vad vill du göra? Klicka 1, 2, respektive 3 för att välja: ");
            Console.WriteLine("Tänk på att du enbart kan jämföra !MAX! 8 st olika tapeter. ");
            Console.WriteLine("1: Lägga till en tapet");
            Console.WriteLine("2: Skriva ut listorna av tapeterna");
            Console.WriteLine("3: Avsluta programm");

            int valdVäg = int.Parse(Console.ReadLine());

            switch (valdVäg)
            {
                case 1:
                    {
                        Console.Clear();
                        Console.WriteLine("Vad heter din tapet? ");
                        string namnTapet = Console.ReadLine();
                        listaNamn.Add(namnTapet);

                        /*Räknar ut det antal rullar som användaren behöver. Detta görs utan hänsyn till mönster eller att tapeten ska sitta rätt.
                        Uträkningen görs genom att först dividera väggens bredd, (måttBredd), med tapetens bredd (tapetBredd), 
                        vilket ger oss antalet rullar vi behöver för att täcka väggens bredd med tapeter (antalRullar bredd). 
                        Detta värde avrundas uppåt då vi inte kan köpa halva tapetrullar. 
                        
                        Sedan multipliceras det antal tapeter som behövs för att täcka väggens bredd, (antalRullar bredd), med väggens längd, (måttLängd). Slutligen divideras detta med
                        tapetens längd, (tapetLängd), vilket ger oss totala antalet rullar vi behöver för att täcka hela väggen, (antalRullarVägg). 
                        Även detta värde, (antalRullarVägg), avrundas uppåt av samma anledning som innan. 
                        */

                        Console.WriteLine("Hur bred är tapeten? (meter) ");
                        double tapetBredd = double.Parse(Console.ReadLine());
                        Console.WriteLine("Hur lång är tapeten? (meter) ");
                        double tapetLängd = double.Parse(Console.ReadLine());
                        double antalRullarBredd = (måttBredd / tapetBredd);
                        int kolumnRullar = Convert.ToInt32((Math.Ceiling(antalRullarBredd)));
                        int antalRullarVägg = Convert.ToInt32((Math.Ceiling((antalRullarBredd * måttLängd) / tapetLängd)));
                        Console.WriteLine($"Totala antal rullar du behöver blir {antalRullarVägg} st");
                        listaTapet.Add(antalRullarVägg);

                        //Det totala priset blir antalet rullar tapet multiplicerat med vad en rulle tapet kostar. 
                        Console.WriteLine("vad kostar tapeten? (kr/rulle) ");
                        double tapetPris = double.Parse(Console.ReadLine());
                        double prisTotal = antalRullarVägg * tapetPris;
                        Console.WriteLine($"Det totala priset för din tapet blir därmet: {prisTotal} kr ");
                        listaPris.Add(tapetPris);
                        listaPrisTotal.Add(prisTotal);

                        Console.WriteLine("Tryck Enter för att fortsätta: ");
                        Console.ReadLine();
                        Console.Clear();

                            break;
                    }

                case 2:
                    { 
                        Console.Clear();
                        Console.WriteLine("Här kommer dina tapeter som en lista: ");

                        //Räknar upp listorna i ordning med hjälp av en "foreach" där loopen körs tills det inte finns något mer i listan "listaNamn".
                        //Då listan "listaNamn" och alla andra listor är lika stora så kommer loopen skriva ut allt i listorna. 
                        for (int i = 0; i < listaNamn.Count; i++)
                        {
                            Console.Write("Namn: ");
                            Console.WriteLine(listaNamn[i]);
                            Console.Write("Antal tapetrullar: ");
                            Console.WriteLine(listaTapet[i]);
                            Console.Write("Kr/Rulle: ");
                            Console.WriteLine(listaPris[i]);
                            Console.Write("Totalt pris för tapet: ");
                            Console.WriteLine(listaPrisTotal[i]);
                            Console.Write("");
                        }

                            break;
                    }

                case 3:
                    {
                        tapetVäg = false;
                            break;
                    }
                        
                default:
                    {
                        Felmeddelande();
                            break;
                    }
            }

            a++;
        }
    }

    /// <summary>
    /// Metod som körs för att täcka golvet med mattor
    /// </summary>
    static int Mattor()
    {
        //Skapar två lister för mattornas längd och bredd. Detta för att jag sedan ska kunna skriva ut mattorna som användaren har använt. 
        List<int> listaMattaBredd = new List<int>();
        List<int> listaMattaLängd = new List<int>();
        int b = 0;
        bool mattaVäg = true;
        while (mattaVäg)
        {
            Console.WriteLine("Meny: ");
            Console.WriteLine("1: Lägga till mattor");
            Console.WriteLine("2: Skriva ut mattorna");
            Console.WriteLine("3: Avsluta programm");
            int mattaVal = int.Parse(Console.ReadLine());

            switch (mattaVal)
            {
                case 1:
                    {
                        Console.WriteLine("Du ska täcka ditt golv med golvmattor. Jag behöver följande: ");
                        Console.WriteLine("Golvets bredd: ");
                        double golvBredd = double.Parse(Console.ReadLine());
                        Console.WriteLine("Golvets längd: ");
                        double golvLängd = double.Parse(Console.ReadLine());
                        Console.WriteLine($"Din area blir: {golvBredd * golvLängd} m^2 ");
                        double golvArea = golvLängd * golvBredd;

                        // "täcktGolv" sätts till noll och adderas varje gång anvädnaren valt att lägga till en matta på golvet. 
                        double täcktGolv = 0;
                        //Använder do-while för att se om mattorna tänker golvarean. Använder även en variabel som räknas efter varje gång loopen utförs för att bestämma antal mattor man behöver. 
                        
                        do
                        {
                            Console.WriteLine("Ta en matta och mata in mattans mått: ");
                            Console.WriteLine("Matta bredd: ");
                            int mattaBredd = int.Parse(Console.ReadLine());
                            listaMattaBredd.Add(mattaBredd);
                            Console.WriteLine("Matta längd: ");
                            int mattaLängd = int.Parse(Console.ReadLine());
                            listaMattaLängd.Add(mattaLängd);

                            täcktGolv = täcktGolv + (mattaBredd * mattaLängd);

                            Console.WriteLine($"Täckt golv blir: {täcktGolv} m^2");
                            b++;
                        } while (täcktGolv < golvArea);
                        return b;
                        
                    }

                case 2:
                    {
                        Console.Clear();
                        Console.WriteLine("Här kommer dina tapeter som en lista: ");

                        //Räknar upp listorna i ordning med hjälp av en "foreach" där loopen körs tills det inte finns något mer i listan "listaMattaBredd". 
                        //Då listan "listaMattaBredd" är lika stor som listan "listaMattaLängd" så kommer loopen skriva ut allt i listorna. 
                        for (int i = 0; i < listaMattaBredd.Count; i++)
                        {
                            Console.Write("Matta Bredd: ");
                            Console.WriteLine(listaMattaBredd[i]);
                            Console.Write("Matta Längd: ");
                            Console.WriteLine(listaMattaLängd[i]);
                            Console.Write("");
                        }
                        return b;
                        
                    }

                case 3:
                    {
                        mattaVäg = false;
                        return b;
                        
                    }


                default:
                    {
                        Felmeddelande();
                        return b;
                        
                    }
                    
            }

            

        }   
    }
}

嗨!我需要一些帮助来解决我的问题。我不知道为什么我不能 return 我的值 b 到我的主要方法。我所有的东西都是用瑞典语写的,所以如果你需要一些翻译,我会做的!

谢谢!

因为你的所有 returns 都在 while 循环中。 来自 msdn:msdn

  • while 语句:有条件地执行其主体 零次 或更多次。

意思是不保证 while 循环内的代码会被执行。它可能只是跳过整个,但在它之后没有 returns,这就是你得到错误的原因:"Not all code paths return a value",虽然多个路径 returns 一个值,NOT所有路径。

您在开头指定 mattaVag 变量为 true 但编译器不知道。如果这个循环至少要执行一次,就把它改成do...while。 或者将 return b; 放在循环之外

static int Mattor() {
    int b = 0;
    bool mattaVäg = true;
    
    do {
        int mattaVal = int.Parse(Console.ReadLine());

        switch (mattaVal) {
            case 1:
                mattaVäg = false;
                break;
            case 2:
                mattaVäg = false;
                break;
            case 3:
                mattaVäg = false;
                break;
            default:
                Felmeddelande();
            break;
        }
    } while (mattaVäg);

    return b;
}

编辑“为什么我不能选择什么时候想要return一个值,什么时候不想?” 你可以选择。您选择 return 和 int,因此它必须 return 和 int

你可以试试这个:

调用方法:Mattor(out int b);

//Note!!! This is now a void method. 
//No return value, but we passed in a variable what you will get back
static void Mattor(out int b) {
    b = 0;
    bool mattaVag = true;

    do {
        int mattaVal = int.Parse(Console.ReadLine());

        switch (mattaVal) {
            case 1: 
                b++;
                mattaVag = false;
                break;
            case 2:
                mattaVag = false;
                break;
            default:
                break;
        }

    } while (mattaVag);
}

在外部 while 循环完成后移动语句 return b;。当您完成每个 switch case 的计算时,请确保在末尾添加 break。这将始终 return b 无论它是 0(默认值)还是在 while 循环中更改。

static int Mattor()
{
  ...
  while (mattaVäg) {
    switch(mattaVal) {
      case 1: 
        // do work
        break;     <==== here

      default:
        // default work
        break;     <==== here
    }
  }
  return b;    <=== here
}