C# “为什么我会得到一个错误?”;“最喜欢的”;在我的交换机的当前上下文中不存在?

C# “为什么我会得到一个错误?”;“最喜欢的”;在我的交换机的当前上下文中不存在?,c#,C#,我是全新的开发人员,所以如果这是一个愚蠢的问题,请原谅我。 下面是我当前项目的一个片段。当我使用if语句根据用户输入分配我的“favorite”变量时,switch语句中的“favorite”会出现红色的波形,但如果我直接声明favorite变量,则不会出现红色的波形。错误表示当前上下文中不存在收藏夹。如果以前有人问过我这个问题,我很抱歉,但我对这个论坛也是全新的。提前感谢您提供的任何照明 class Program { enum Color { Red,

我是全新的开发人员,所以如果这是一个愚蠢的问题,请原谅我。 下面是我当前项目的一个片段。当我使用if语句根据用户输入分配我的“favorite”变量时,switch语句中的“favorite”会出现红色的波形,但如果我直接声明favorite变量,则不会出现红色的波形。错误表示当前上下文中不存在收藏夹。如果以前有人问过我这个问题,我很抱歉,但我对这个论坛也是全新的。提前感谢您提供的任何照明

 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);
}