2016-05-26 66 views
-2

我知道這些問題很多,而且我嘗試過每一個問題。爲什麼這會輸出錯誤:not all code paths return a value並非所有代碼路徑都返回一個值PigLatin

using System; 

namespace PigLatin 
{ 
    public class Translate 
    { 
     public static string Transfer(string input) 
     { 

      string firstChar = ""; 
      string lastChars = ""; 
      int x; 
      string vowel = "AEIOUaeiou"; 

      string[] pieces = input.Split(null); 

      try 
      { 
       foreach (string piece in pieces) 
       { 
        lastChars = piece.Substring(1); 
        firstChar = piece.Substring(0, 1); 

        x = vowel.IndexOf(firstChar); 

        if (x == -1) 
        { 
         var pigLatin = lastChars + firstChar + "ay"; 
         return pigLatin; 
        } 
        else 
        { 
         var pigLatin = firstChar + lastChars + "way"; 
         return pigLatin; 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 

     static void Main(string[] args) 
     { 
      Console.Write("Enter word to translate: "); 
      var toTranslate = Console.ReadLine(); 
      Console.WriteLine(Transfer(toTranslate)); 
     } 
    } 
} 

我已經試過什麼:

  • 改變Transfer的變量const

    const string firstChar = ""; 
        const string lastChars = ""; 
        int x; 
        const string vowel = "AEIOUaeiou"; 
    
  • 擺脫if語句的使用操作

    var pigLatin = ""; 
    x == -1 ? pigLatin = lastChars + firstChar + "ay" : pigLatin = firstChar + lastChars + "way" 
    return pigLatin; 
    

什麼是導致錯誤?

+2

如果有異常,會發生什麼後return語句?您將錯誤寫入控制檯,然後..繼續而不返回值。此外,如果'pieces'中沒有任何內容,for循環將不會執行,並且..您不執行'return'語句。 – Blorgbeard

+2

你錯過了一個return語句! – Dazzler

+1

另外,爲什麼「不是所有的代碼路徑都返回一個值」表明變量常量會有所幫助? – Blorgbeard

回答

0

你缺少你try和catch塊

using System; 

namespace PigLatin 
{ 
    public class Translate 
    { 
    public static string Transfer(string input) 
    { 

     string firstChar = ""; 
     string lastChars = ""; 
     int x; 
     string vowel = "AEIOUaeiou"; 

     string[] pieces = input.Split(null); 

     try 
     { 
      foreach (string piece in pieces) 
      { 
       lastChars = piece.Substring(1); 
       firstChar = piece.Substring(0, 1); 

       x = vowel.IndexOf(firstChar); 

       if (x == -1) 
       { 
        var pigLatin = lastChars + firstChar + "ay"; 
        return pigLatin; 
       } 
       else 
       { 
        var pigLatin = firstChar + lastChars + "way"; 
        return pigLatin; 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
     return 1; //or add any valid return value. This is your missing statement 
    } 

    static void Main(string[] args) 
    { 
     Console.Write("Enter word to translate: "); 
     var toTranslate = Console.ReadLine(); 
     Console.WriteLine(Transfer(toTranslate)); 
    } 
    } 
} 
+0

這不會編譯。 '1'的類型爲'int',不能在聲明爲返回'string'的方法中返回。無論如何,使代碼做正確的事情還不夠。 – hvd

+0

@hvd OP詢問缺少的是什麼,我在評論中加入了可以返回任何值的函數,而不僅僅是'1'。由OP以適當的返回值修復它。 :) – Dazzler

1

原因如下:如果發生異常並且捕獲觸發器,則不會返回值。

 catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
     return ""; // this should fix the error message. 
    } 
+0

這可能足以讓編譯器停止發佈錯誤消息,但僅僅使代碼做正確的事情還不夠。 – hvd

+0

@ hvd該操作系統特別詢問「是什麼導致錯誤?」我回答說。他並沒有要求我們修正他的代碼以正確渲染拉丁文。你欠我一個「投票」。 :P – BoltBait

+0

如果'返回'「;'在得到異常之後是正確的做法,那麼在忽略OP的其他代碼中會有一些意義,但它幾乎肯定不是'噸。 – hvd

相關問題