C# “为什么我会得到一个错误?”;“最喜欢的”;在我的交换机的当前上下文中不存在?
我是全新的开发人员,所以如果这是一个愚蠢的问题,请原谅我。 下面是我当前项目的一个片段。当我使用if语句根据用户输入分配我的“favorite”变量时,switch语句中的“favorite”会出现红色的波形,但如果我直接声明favorite变量,则不会出现红色的波形。错误表示当前上下文中不存在收藏夹。如果以前有人问过我这个问题,我很抱歉,但我对这个论坛也是全新的。提前感谢您提供的任何照明C# “为什么我会得到一个错误?”;“最喜欢的”;在我的交换机的当前上下文中不存在?,c#,C#,我是全新的开发人员,所以如果这是一个愚蠢的问题,请原谅我。 下面是我当前项目的一个片段。当我使用if语句根据用户输入分配我的“favorite”变量时,switch语句中的“favorite”会出现红色的波形,但如果我直接声明favorite变量,则不会出现红色的波形。错误表示当前上下文中不存在收藏夹。如果以前有人问过我这个问题,我很抱歉,但我对这个论坛也是全新的。提前感谢您提供的任何照明 class Program { enum Color { Red,
class Program
{
enum Color
{
Red, Orange, Green, Blue, Indigo, Violet
}
static void Main(string[] args)
{
string userChoice = Console.ReadLine();
Console.WriteLine("Please enter the number of your favorite color out of the following choices. /n Where 1 = Red /n 2 = Orange /n 3 = Green /n 4 = Blue /n 5 = Indigo /n 6 = Violet");
if (userChoice == "1")
{
Color favorite = Color.Red;
}
if (userChoice == "2")
{
Color favorite = Color.Orange;
}
if (userChoice == "3")
{
Color favorite = Color.Green;
}
if (userChoice == "4")
{
Color favorite = Color.Blue;
}
if (userChoice == "5")
{
Color favorite = Color.Indigo;
}
if (userChoice == "6")
{
Color favorite = Color.Violet;
}
switch (favorite)
{
case Color.Red:
Console.WriteLine("You chose Red");
break;
case Color.Orange:
Console.WriteLine("You chose Orange");
break;
case Color.Green:
Console.WriteLine("You chose Green");
break;
case Color.Blue:
Console.WriteLine("You chose Blue");
break;
case Color.Indigo:
Console.WriteLine("You chose Indigo");
break;
case Color.Violet:
Console.WriteLine("You chose Violet");
break;
default:
Console.WriteLine("You didn't choose a color");
break;
}
}
}
为什么我在当前文件中不存在“收藏夹”的错误
我的开关上的上下文
因为您已在if
语句体中将favorite
声明为局部变量。这意味着变量favorite
无法从这些主体中访问
我们怎样才能解决这个问题
我会尝试以下方法(还有其他选择):
在“if”主体中定义“favorite”变量,然后在“favorite”变量上使用“switch”。但让我们想想如果没有人“如果”身体着火会发生什么正确,不会定义“favorite”变量,但它在“switch”语句中使用-逻辑错误。这就是为什么编译器可以防止您犯这个错误。只需在“if”主体中定义“favorite”变量,然后在“if”主体中为其指定必要的值。“favorite”仅在每个单独的“if”范围内创建,然后被“销毁”
if (userChoice == "1") // Here favorite does not exist yet
{
Color favorite = Color.Red; // favorite is created and assigned Color.Red
} // The scope of "if" ends, so all variables created within are destroyed, in this case, "favorite"
所以你真正想做的是
Color? favorite = null;
if (userChoice == "1") // Here favorite already exists
{
favorite = Color.Red; // favorite is assigned Color.Red
} // Same as before, but favorite is not destroyed this time because it was not created(declared) within "if"'s scope
另一方面,不能按原样使用带有颜色的开关:
switch语句的控制类型由switch表达式建立
•如果开关表达式的类型为sbyte、byte、short、ushort、int、uint、long、ulong、bool、char、string或枚举类型,或者是与这些类型之一对应的可为空类型,则这是开关语句的控制类型
•否则,必须存在一个用户定义的隐式转换(§6.4),从开关表达式的类型转换为以下可能的控制类型之一:sbyte、byte、short、ushort、int、uint、long、ulong、char、string或对应于这些类型之一的可空类型
•否则,如果不存在此类隐式转换,或者如果存在多个此类隐式转换,则会发生编译时错误
(从C#5.0规范,8.7.2开关语句-您可以在…\Microsoft Visual Studio 12.0\VC#\Specifications\1033\CSharp Language specification.docx中找到它)
在这里,假设您只是在玩弄if和switch语句,最终结果将更符合
static void Main(string[] args)
{
Console.WriteLine("Please enter the number of your favorite color out of the following choices. \n Where 1 = Red \n 2 = Orange \n 3 = Green \n 4 = Blue \n 5 = Indigo \n 6 = Violet");
string userChoice = Console.ReadLine();
Color? favorite = null;
if (userChoice == "1")
{
favorite = Color.Red;
}
if (userChoice == "2")
{
favorite = Color.Orange;
}
if (userChoice == "3")
{
favorite = Color.Green;
}
if (userChoice == "4")
{
favorite = Color.Blue;
}
if (userChoice == "5")
{
favorite = Color.Indigo;
}
if (userChoice == "6")
{
favorite = Color.Violet;
}
switch (userChoice)
{
case "1":
Console.WriteLine("You chose Red");
break;
case "2":
Console.WriteLine("You chose Orange");
break;
case "3":
Console.WriteLine("You chose Green");
break;
case "4":
Console.WriteLine("You chose Blue");
break;
case "5":
Console.WriteLine("You chose Indigo");
break;
case "6":
Console.WriteLine("You chose Violet");
break;
default:
Console.WriteLine("You didn't choose a color");
break;
}
Console.ReadKey(true);
}
好的,谢谢你的快速回复。我试图在if语句之外定义“favorite”变量,但得到了一个不同的错误,即:名为“favorite”的局部变量不能在此范围内声明,因为它会赋予“favorite”不同的含义,已在“父级或当前”范围中用于表示其他内容。@NewbMilo请查看我的答案,并告诉我您是否清楚。谢谢,谢谢你的快速回复。我试图在if语句之外定义“favorite”变量,但得到了一个不同的错误,即:名为“favorite”的局部变量不能在此范围内声明,因为它将赋予“favorite”不同的含义,而“favorite”已在“parent或current”范围内用于表示其他内容。我看不到您的代码。但是如果你已经这样做了:
Color-favorite代码>外部if语句,然后在每个if
的语句代码块中有此颜色收藏夹=Color.Red代码>,这是一个错误。不能用相同的名称定义两个变量。另一方面,如果你尝试我的答案,你会发现它是有效的。我试图做的是使用我在颜色枚举中定义的颜色。您提供的解决方案消除了枚举。我仍然想使用枚举。我删除了enum
,以便复制和粘贴所有代码。当然,您将使用您的枚举,并且您将添加不在我的枚举中的if和switch语句。此外,我将favoriteColor
重命名为color
。显然,你也可以改变这个。啊,我明白了,盲人说!谢谢你的耐心。我意识到可能有更好的方法来完成同样的任务,但我试图更好地理解枚举和开关之间的关系。再次感谢。
static void Main(string[] args)
{
Console.WriteLine("Please enter the number of your favorite color out of the following choices. \n Where 1 = Red \n 2 = Orange \n 3 = Green \n 4 = Blue \n 5 = Indigo \n 6 = Violet");
string userChoice = Console.ReadLine();
Color? favorite = null;
if (userChoice == "1")
{
favorite = Color.Red;
}
if (userChoice == "2")
{
favorite = Color.Orange;
}
if (userChoice == "3")
{
favorite = Color.Green;
}
if (userChoice == "4")
{
favorite = Color.Blue;
}
if (userChoice == "5")
{
favorite = Color.Indigo;
}
if (userChoice == "6")
{
favorite = Color.Violet;
}
switch (userChoice)
{
case "1":
Console.WriteLine("You chose Red");
break;
case "2":
Console.WriteLine("You chose Orange");
break;
case "3":
Console.WriteLine("You chose Green");
break;
case "4":
Console.WriteLine("You chose Blue");
break;
case "5":
Console.WriteLine("You chose Indigo");
break;
case "6":
Console.WriteLine("You chose Violet");
break;
default:
Console.WriteLine("You didn't choose a color");
break;
}
Console.ReadKey(true);
}