Если (Integer Console.Readline «» или null) не работает

Я не могу понять после поиска и поиска (вы знаете, как это происходит), почему этот код не работает.

Я просто хочу, чтобы это работало вот так

if (Nummer == "") {
    Console.WriteLine("0");
}

Вот и все, и это не работает. Искал полтора часа. Не могу понять, почему существует простое базовое объяснение. Я только нашел, как исправить это с помощью строки или чего-то еще, затем я попытался преобразовать это, но это все еще не сработало. Может кто-то помочь мне, пожалуйста?

Благодарю за терпение за мои ограниченные знания. Спасибо за ваше время

static void Main(string[] args)
{
    bool herhaal = true;

    do
    {                
        Console.Write("Geef een getal : ");
        int Nummer = Convert.ToInt16(Console.ReadLine());           

        if (Console.ReadLine() == "" && Console.ReadLine() == null)
        {
            Console.WriteLine("0");
        }

        double kw = Math.Pow(Nummer, 2);

        Console.WriteLine("Kwadraat van {0} is: {1}", Nummer, kw + Environment.NewLine);
    } while (herhaal);
}
#
Источник
  • 7
    Вы вызываете ReadLine() три раза. Здесь читаются три строки.
  • 0
    Не уверен, но вы можете попробовать if(String.IsNullOrEmpty(Nummer)){Console.WriteLine("0");} И @SLaks прав, что также может быть причиной ваших проблем.
  • 0
    почему бы просто не поместить в ваш реальный код « I just want it to work like this
Codelisting
за 2 против
Лучший ответ
static void Main(string[] args)
{
    int Nummer;
    bool herhaal = true;
    do
    {                
        Console.Write("Geef een getal : ");          
        //only read from the Console ONCE per loop iteration, and always read to a string first
        string input = Console.ReadLine(); 

        //TryParse better than Convert for converting strings to integers
        if (!int.TryParse(input, out Nummer))        
        {
            Console.WriteLine("0");
        }
        else  //only do the second part if the conversion worked
        {
            double kw = Math.Pow(Nummer, 2);
            Console.WriteLine("Kwadraat van {0} is: {1}\n", Nummer, kw);
        }

    } while (herhaal);
}

Чтобы сделать это из приложения WinForms, как это было сделано в комментариях:

private void button1_Click(object sender, EventArgs e)
{
    double aantalgroep;
    if (!double.TryParse(textBox1.Text, out aantalgroep))        
    {
        textBox1.Text = "0";
    }
    else 
    {
        double kw = Math.Pow(aantalgroep, 2);
        textBox1.Text = String.Format("Kwadraat van {0} is: {1}", aantalgroep, kw);
    }
}
  • 0
    Большое тебе спасибо. И если я не нахожусь в консоли, просто в приложении форм этот синтаксис такой же? Потому что сейчас я занят этим aantalgroep = double.Parse(textBox1.Text); if (aantalgroep == null) { textBox1.Text = "0"; } Поскольку это не работает, я собираюсь попробовать, как вы сделали это здесь, с другим моим кодом.
  • 0
    Это не совсем то же самое. В приложении с формами нет такой вещи, как Console , и вы НИКОГДА не пишете цикл while(true) Вместо этого у вас есть кнопка с click и текстовое поле, в котором вы проверяете свойство Text Кроме того, примитивные типы, такие как int и double , никогда не будут нулевыми. Вы все равно должны использовать TryParse() как я показал в этом ответе, и проверить результат этой функции.
за 1 против

ВConsole.ReadLine() Метод «читает» одну строку пользовательского ввода и сохраняет в той переменной, которой вы его присвоили. Вот дополнительная информация .

Итак, ваша следующая строка кода читает число, которое вы вводите и сохраняете вNummer .

int Nummer = Convert.ToInt16(Console.ReadLine());           

Но затем вы продолжаете и делаете еще дваConsole.ReadLine() вызовы методов в вашемif заявление, так чтоif на самом деле, это попытка прочитать с консоли еще два раза и посмотреть, будет ли первое чтение"" и если второе чтениеnull , что не является вашим желаемым поведением.

Все, что вы хотите сделать, - это прочитать один раз и сравнить все, что вы читаете. Судя по вашему коду, похоже, вы хотите вывести квадрат числа, введенного пользователем, поэтому вам, вероятно, следует проверить больше, чем простоNummer == "" , поскольку если бы пользователь ввел алфавитный символ, это также привело бы к ошибке. Итак, используяint.TryPrase() это лучший вариант для вас.

static void Main(string[] args)
{
    bool herhaal = true;
    do
    {
        Console.Write("Geef een getal : ");
        string Nummer = Console.ReadLine();

        if (int.TryParse(Nummer, out int result))
        {
            double kw = Math.Pow(result, 2);
            Console.WriteLine("Kwadraat van {0} is: {1}", Nummer, kw + Environment.NewLine);
            herhaal = false;
        }
        else
        {
            Console.WriteLine("0");
        }

    } while (herhaal);

    Console.ReadLine();
}
  • 0
    Спасибо за ваше время и ответ. И если я не нахожусь в консоли, просто в приложении форм этот синтаксис такой же? Потому что сейчас я занят этим aantalgroep = double.Parse(textBox1.Text); if (aantalgroep == null) { textBox1.Text = "0"; } Поскольку это не работает, я собираюсь попробовать, как вы сделали это здесь, с другим моим кодом.
  • 0
    Не используйте double.Parse() , используйте вместо него double.TryPrase() Последний пытается преобразовать string в double и возвращает true случае успеха и false случае неудачи. Найдите в документации по C # определения двух методов. Таким образом, вы можете просто проверить вывод double.TryParse() и, если это true , делать со значением все, что хотите, а если false , вы можете установить textBox1.Text = "0" .
  • 0
    Спасибо за ответ, чтобы прояснить. Я меняю его на TryParse и в операторе if могу использовать '(aantalgroep == false) ??? Или вы просто имеете в виду, что я могу использовать '(aantalgroep == «»)' Извините, что не проверил свой ноутбук, но я проснулся посреди ночи и использую свой телефон. Просто чтобы знать это наверняка, потому что я терял много часов, чтобы понять простые вещи.
  • 0
    Прежде всего, вы должны проверить это на своем ПК. Затем вам, вероятно, следует вернуться к чертежной доске и узнать о типах данных. Тип сравнения, который вы можете выполнять с переменной, зависит от ее типа; если это boolean вы можете выполнить true/false , а если это string вы можете выполнить сравнение строк и т. д.
за 0 против

Согласно документации C # ,Console.ReadLine делает следующее

Reads the next line of characters from the standard input stream.

Это означает, что каждый раз, когда вы звонитеConsole.ReadLine , из консоли будет прочитана новая строка. Судя по тому, что я вижу в вашем коде, это не то поведение, которое вам нужно. Чтобы решить вашу проблему, вы должны сохранить результатConsole.ReadLine в переменной и используйте эту переменную вместо метода ReadLine.

Codelisting
Популярные категории
На заметку программисту