Return switch 语句中的文件位置
Return a file location from a switch-statement
我对编程还很陌生,但我正在尝试让我的方法 return 包含一个文件位置的值,该文件位置取决于用户所需的选择。
我已经摆弄了一天多了,一直在研究如何正确 return 值,我一直告诉我不是所有代码路径 return 一个值。
我该如何解决这个问题并将代码路径 returned 到 main
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);
}
}
好吧,你遇到了编译器无法正确理解的情况。
您正在 while 循环中检查 errorCheck,里面有一个 case。这种情况将始终执行 return,但是当编译器看到 errorCheck 在没有 return 的情况下为真的可能性时,它会抱怨执行路径可能不存在 return。
首先,您在所有情况下都在执行 return,因此可以安全地删除 while,因为它什么都不做。否则,如果您打算不 return 总是真正循环直到用户选择正确的选项忽略 errorCheck,只需执行 while(true){ ... } 因为当正确时您的开关将 return已选择选项。
用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
我假设您正在尝试做的是将 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;
}
}
}
我对编程还很陌生,但我正在尝试让我的方法 return 包含一个文件位置的值,该文件位置取决于用户所需的选择。 我已经摆弄了一天多了,一直在研究如何正确 return 值,我一直告诉我不是所有代码路径 return 一个值。 我该如何解决这个问题并将代码路径 returned 到 main
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);
}
}
好吧,你遇到了编译器无法正确理解的情况。
您正在 while 循环中检查 errorCheck,里面有一个 case。这种情况将始终执行 return,但是当编译器看到 errorCheck 在没有 return 的情况下为真的可能性时,它会抱怨执行路径可能不存在 return。
首先,您在所有情况下都在执行 return,因此可以安全地删除 while,因为它什么都不做。否则,如果您打算不 return 总是真正循环直到用户选择正确的选项忽略 errorCheck,只需执行 while(true){ ... } 因为当正确时您的开关将 return已选择选项。
用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
我假设您正在尝试做的是将 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;
}
}
}