Как устранить ошибку «Имя *** не существует в текущем контексте»? - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь добавить блок Try / Catch к этому коду, но не могу понять, что нужно изменить, чтобы он заработал ..

Есть предложения? Получение этой ошибки:

«Ошибка CS0103 Имя« Фаренгейт »не существует в текущем контексте»

class Program
{
    static int FahrenheitToCelsius(int fahrenheit)
    {
        int celsius = ((fahrenheit - 32) * 5) / 9;
        return celsius;
    }

    static void Main(string[] args)
    {
        int celsius;

        Console.WriteLine("Hello! Welcome to the sauna!");
        Console.WriteLine();
        Console.WriteLine("Please enter your desired degrees in Fahrenheit: ");

        do
        {
            try
            {
                int fahrenheit = Convert.ToInt32(Console.ReadLine());
            }
            catch (FormatException)
            {
            }

            celsius = FahrenheitToCelsius(fahrenheit);
            Console.WriteLine("The sauna is now set to " + fahrenheit + 
                " degrees Fahrenheit, which equals to " + celsius + " degrees Celsius.");

            if (celsius < 25)
            {
                Console.WriteLine("Way too cold! Turn the heat up: ");
            }
            else if (celsius < 50)
            {
                Console.WriteLine("Too cold, turn the heat up: ");
            }
            else if (celsius < 73)
            {
                Console.WriteLine("Just a little bit too cold, turn the heat up a " + 
                    "little to reach the optimal temperature: ");
            }
            else if (celsius == 75)
            {
                Console.WriteLine("The optimal temperature has been reached!");
            }
            else if (celsius > 77)
            {
                Console.WriteLine("Too hot! Turn the heat down: ");
            }
            else
                Console.WriteLine("The sauna is ready!");
            {
            }
        } while (celsius < 73 || 77 < celsius);

        Console.ReadLine();
    }
}

Ответы [ 4 ]

1 голос
/ 12 марта 2019

Здесь есть пара проблем. Основным является то, что Fahrenheit необходимо объявить вне блока try, так как вы используете его вне этого блока (переменные попадают в область, в которой они объявлены). Перемещение его туда, где вы определяете celsius, кажется логичным, хотя обычно лучше объявить переменные в самой необходимой области.

Во-вторых, вы должны использовать метод int.TryParse для проверки ввода пользователя, а не блока try/catch. Он работает намного лучше и чище, более намеренный код. Прочитайте ответ на этот вопрос для получения дополнительной информации.

Этот метод возвращает true в случае успеха и принимает string для анализа (мы используем возвращаемое значение Console.ReadLine() непосредственно ниже) и параметр out, который будет установлен в преобразованное целое число, если успешный.

Эти изменения могут выглядеть примерно так:

private static void Main(string[] args)
{
    int celsius;

    Console.WriteLine("Hello! Welcome to the sauna!\n");

    do
    {
        // Use a loop with TryParse to validate user input; as long as
        // int.TryParse returns false, we continue to ask for valid input
        int fahrenheit;
        do
        {
            Console.Write("Please enter your desired degrees in Fahrenheit: ");

        } while (!int.TryParse(Console.ReadLine(), out fahrenheit));

        celsius = FahrenheitToCelsius(fahrenheit);

        // Rest of loop code omitted...

    } while (celsius < 73 || 77 < celsius);

    Console.ReadLine();
}
0 голосов
/ 12 марта 2019

Посмотрите на этот код:

try
{
    int fahrenheit = Convert.ToInt32(Console.ReadLine());
}

fahrenheit будет существовать только внутри блока try {}, пока вы не попытаетесь использовать его позже. Переместить его в родительскую область:

int fahrenheit;
while (true)
{
   try
   {
        fahrenheit = Convert.ToInt32(Console.ReadLine());
        break;
   }
   catch (FormatException)
   {
      continue;
   }
}
celsius = FahrenheitToCelsius(fahrenheit);

Обратите внимание, что в случае FormatException вычислять нечего, поэтому я добавил цикл while (true) с continue внутри блока catch. Также я рекомендую использовать метод Int32.TryParse здесь, он будет возвращать результат анализа как bool вместо возбуждения исключения.

0 голосов
/ 12 марта 2019

Вы должны объявить переменную во внешней области видимости, чтобы получить исключительную программу на C #.

Таким образом, вы получите конечную переменную, назначенную в случае успешного преобразования, в противном случае вы просто запросите у пользователя значение:

class Program
{
    static int FahrenheitToCelsius(int fahrenheit)
    {
        int celsius = ((fahrenheit - 32) * 5) / 9;
        return celsius;
    }

    static void Main(string[] args)
    {
        int celsius;

        Console.WriteLine("Hello! Welcome to the sauna!");
        Console.WriteLine();
        Console.WriteLine("Please enter your desired degrees in Fahrenheit: ");
        do
        {
            // you have to declare the variable out of the scope
            int fahrenheit;
            try
            {
                fahrenheit = Convert.ToInt32(Console.ReadLine());
            }
            catch (FormatException)
            {
                // and here you have to handle the exception
                Console.WriteLine("Invalid value.");
                continue;                    
            }

            celsius = FahrenheitToCelsius(fahrenheit);
            Console.WriteLine("The sauna is now set to " + fahrenheit + " degrees Fahrenheit, which equals to " + celsius + " degrees Celsius.");

            if (celsius < 25)
            {
                Console.WriteLine("Way too cold! Turn the heat up: ");
            }
            else if (celsius < 50)
            {
                Console.WriteLine("Too cold, turn the heat up: ");
            }
            else if (celsius < 73)
            {
                Console.WriteLine("Just a little bit too cold, turn the heat up a little to reach the optimal temperature: ");
            }
            else if (celsius == 75)
            {
                Console.WriteLine("The optimal temperature has been reached!");
            }
            else if (celsius > 77)
            {
                Console.WriteLine("Too hot! Turn the heat down: ");
            }
            else
                Console.WriteLine("The sauna is ready!");
            {
            }
        } while (celsius < 73 || 77 < celsius);
        Console.ReadLine();

    }
}
0 голосов
/ 12 марта 2019

Вы могли бы сделать несколько разных вещей.

  1. Вы можете поставить вверху кода рядом с int celcisus также int fahrenheit
  2. Вы можете поместить весь код в try, и, если что-то не получится, все будет в порядке.
...