2015-08-29 2 views
-2

Я довольно новичок в программировании, но я пытаюсь вернуть метод методу, который содержит местоположение файла, которое зависит от желаемого пользователя. Я занимаюсь этим уже более дня и зациклился на том, как правильно вернуть значение, я держу его в себе, говоря, что не все пути кода возвращают значение. Как исправить это и есть путь код возвращается к главномуВернуть местоположение файла из оператора switch

public static string fileLocation() 
    { 
     int fileRequest = 10; 
     bool errorCheck = true; 
     string filePath; 

     while (errorCheck == true) 
     { 
      Console.Write(">Enter '1' through '9' to choose a hand."); 
      Console.Write("Enter '0' for random."); 
      fileRequest = Convert.ToInt16(Console.ReadLine()); 

      switch (fileRequest) 
      { 
       case 0: 
        Console.WriteLine(">Random selection loading."); 
        Random rnd = new Random(); 
        fileRequest = rnd.Next(10); 
        errorCheck = true; 
        return (null); 

       case 1: 
        Console.WriteLine(">Loading file one."); 
        filePath = Path.GetFullPath("Flush.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       case 2: 
        Console.WriteLine(">Loading file two."); 
        filePath = Path.GetFullPath("FourKind.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       case 3: 
        Console.WriteLine(">Loading file three."); 
        filePath = Path.GetFullPath("FullHouse.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       case 4: 
        Console.WriteLine(">Loading file four."); 
        filePath = Path.GetFullPath("Pair.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       case 5: 
        Console.WriteLine(">Loading file five."); 
        filePath = Path.GetFullPath("RoyalFlush.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       case 6: 
        Console.WriteLine(">Loading file six."); 
        filePath = Path.GetFullPath("Straight.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       case 7: 
        Console.WriteLine(">Loading file seven."); 
        filePath = Path.GetFullPath("StraightFlush.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       case 8: 
        Console.WriteLine(">Loading file eight."); 
        filePath = Path.GetFullPath("ThreeKind.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       case 9: 
        Console.WriteLine(">Loading file nine."); 
        filePath = Path.GetFullPath("TwoPair.txt"); 
        errorCheck = false; 
        return (Convert.ToString(filePath)); 

       default: 
        Console.WriteLine(">Invalid request."); 
        filePath = "Invalid"; 
        errorCheck = true; 
        return (null); 
      } 
     } 
+0

Каков ваш код, который вы ожидаете, что он будет вести себя по-другому? Вы научились использовать отладчик IDE и проделывать код по строкам во время его выполнения? – mason

+0

какая у тебя проблема ??? вы ничего не спрашивали ... – Gusman

+1

Вы устанавливаете проверку ошибок на true, а затем имеете цикл, который запускается только в том случае, если он является ложным. Поэтому ваш оператор цикла и переключателя никогда не выполняет – dman2306

ответ

2

Я принимаю то, что вы пытаетесь сделать, это взять целое число от 0 до 9 в качестве ввода. Если это 0, вы хотите относиться к нему случайным образом с 1 по 9. Если это что-то еще, вы хотите снова запросить ввод. Это должно сделать это (непроверено):

public static string FileLocation() 
{ 
    while (true) 
    { 
     Console.Write(">Enter '1' through '9' to choose a hand."); 
     Console.Write("Enter '0' for random."); 
     int fileRequest = Convert.ToInt16(Console.ReadLine()); 
     if (fileRequest == 0) 
      fileRequest = (new Random()).Next(1, 10); 

     switch (fileRequest) 
     { 
      case 1: 
       Console.WriteLine(">Loading file one."); 
       return Path.GetFullPath("Flush.txt"); 

      case 2: 
       Console.WriteLine(">Loading file two."); 
       return Path.GetFullPath("FourKind.txt"); 

      case 3: 
       Console.WriteLine(">Loading file three."); 
       return Path.GetFullPath("FullHouse.txt"); 

      case 4: 
       Console.WriteLine(">Loading file four."); 
       return Path.GetFullPath("Pair.txt"); 

      case 5: 
       Console.WriteLine(">Loading file five."); 
       return Path.GetFullPath("RoyalFlush.txt"); 

      case 6: 
       Console.WriteLine(">Loading file six."); 
       return Path.GetFullPath("Straight.txt"); 

      case 7: 
       Console.WriteLine(">Loading file seven."); 
       return Path.GetFullPath("StraightFlush.txt"); 

      case 8: 
       Console.WriteLine(">Loading file eight."); 
       return Path.GetFullPath("ThreeKind.txt"); 

      case 9: 
       Console.WriteLine(">Loading file nine."); 
       return Path.GetFullPath("TwoPair.txt"); 

      default: 
       Console.WriteLine("Invalid request."); 
       break; 
     } 
    } 
} 
0

Ну, вы попали в случае, когда компилятор не понял правильно.

Вы проверяете наличие ошибки CheckCheck в цикле while и внутри корпуса. этот случай всегда будет делать возврат, но поскольку компилятор видит вероятность того, что errorCheck вернётся без возврата, он жалуется на возможность пути выполнения, где возврат не существует.

Прежде всего, вы делаете возврат во всех случаях, чтобы в то же время можно было безопасно удалить, так как он ничего не делает. Иначе, если вы планируете не возвращаться всегда и действительно цикл до тех пор, пока пользователь не выберет правильную опцию ignore errorCheck, просто сделайте while (true) {...}, когда ваш коммутатор вернется, когда выбран правильный параметр.

+0

Да, был интриг «! =», Но он ведет себя так, как я объяснял, даже когда исправлялся, поэтому мой ответ прав, поэтому нисходящий голос несправедлив, так как этот ответ правильный – Gusman

+0

Я не тот, кто проголосовал вы, я не уверен, кто это был. –

+0

Хорошо, спасибо за разъяснение, не знаю, кто это сделал, но, как я сказал, это действительно непонимание компилятора – Gusman

0

Компилятор жалуется, потому что метод не гарантирует возврат чего-либо. Если цикл while не выполняется, оператор switch также не будет выполнен, поэтому не будет возможности вернуть путь.

Ваш оператор switch хорошо, ваша проблема в том, что ваш цикл while не выполняется. Основываясь на вашем коде, похоже, вы могли бы просто удалить цикл while.

Я бы предоставил образец кода, но я нахожусь на своем телефоне.

EDIT:

Вы изменили свой код, так как я написал свой ответ. Пожалуйста, не изменяйте код после того, как вы разместите вопрос, поскольку это может привести к неправильному отображению всех предыдущих ответов (например, этого). Теперь у меня есть голосующий голос в результате моего вклада ...

Внесите любые изменения кода после ваш исходный код для обновления вопроса.

0

Пример, написанный на VB, но он должен показывать логику. Моя переменная исходила из переменной базы данных, заполненной событием OnLoad, но кроме этого, это в значительной степени то, что вы хотите сделать.

Private Sub ShowPDF() 

    Dim mySelection As Integer = _myDb.MyHuntingArea 
    'the path where the pdf files are located 
    Dim filePath As String = MyMachine.AssemblyDirectory & "\Regulations\" 
    'variable for the appropriate file name to get 
    Dim fileName As String = "" 
    Select Case mySelection 

     Case 1 
      fileName = filePath & "Area1.pdf" 
     Case 2 
      fileName = filePath & "Area2.pdf" 
     Case 3 
      fileName = filePath & "Area3.pdf" 
     Case Else 
      MessageBox.Show("We cannot determine what area you are requesting regulations for. Make sure it is set under Setup.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error) 
    End Select 

    If Not fileName = "" Then 
     Try 
      System.Diagnostics.Process.Start(fileName) 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 
    End If 
End Sub 
Смежные вопросы