2014-11-17 2 views
1

Я помогаю другу с некоторым новичком C#, и мы столкнулись с какой-то странной проблемой.case switch игнорирует Console.ReadLine()

læn = Console.ReadLine() на линии 31 пропускается. Это приводит к ошибке .Parse в строке 32.

Если мы поместим дополнительный læn = Console.ReadLine() в после первого, он начнет работать.

static void Main(string[] args) 
{ 
    double areal, læn1, høj1 = 0; 
    int figur; 
    string tekst, læn, høj; 

    tekst = ("Du skal nu vægle en figur."); 
    tekst += ("\nTryk 1 for rektangel"); 
    tekst += ("\nTryk 2 for cirkel"); 
    tekst += ("\nTryk 3 for en retvinklet trekant"); 
    tekst += ("\nValg: "); 
    Console.Write("{0}", tekst); 
    figur = Console.Read(); 
    switch (figur) 
    { 
     case '1': 
      { 
       Console.WriteLine("Du har valgt en rektangel. \nHvad er længden: "); 
       læn = Console.ReadLine(); //Line 31 
       læn1 = double.Parse(læn); //Line 32 

       Console.WriteLine("hvad er højden?"); 
       høj = Console.ReadLine(); 
       høj1 = double.Parse(høj); 

       areal = læn1 * høj1; 
       Console.WriteLine("\n{0} * {1} = {2}", læn, høj1, areal); 

       Console.ReadKey(); 
      } 
      break; 

     default: 
      Console.WriteLine("Du har ikke valgt 1,2 eller 3"); 
      Console.ReadKey(); 
      break; 
    } 
} 
+2

Какова ценность 'læn' точно? Отлаживай и скажи нам. –

+0

Вероятно, вы хотите 'Console.ReadKey()' вместо 'Console.Read()' –

+0

, вероятно, из-за 'figur = Console.Read()' –

ответ

7

документация от Console.Read состояний:

В Read метод блокирует его возврата при вводе входных символов; он заканчивается, когда вы нажимаете клавишу Enter.

Это означает, что он вернет значение только после нажатия Enter, независимо от того, сколько вы написали.

Поскольку ваш следующий оператор равен Console.ReadLine(), и до сих пор остается конец строки в потоке, ожидающем чтения (поскольку вы нажмете Enter, но только обрабатываете нажатой клавишу), «ест» это утверждение.

Вместо этого используйте вместо этого Console.ReadKey().

+0

Спасибо, что объяснил, что было не так красиво. Мы получили его для работы сейчас :) –

1

Просто, чтобы добавить что-то к тому, что сказал Патрик, я рекомендую вам заменить, что Console.Read() с этим:

ConsoleKeyInfo figur = Console.ReadKey(); 
switch (figur.Key) 
{ 
    case ConsoleKey.D1: 

Также обратите внимание, что все эти круглые скобки при назначении tekst не нужны, а также скобки внутри каждого switchcase.

+1

Возможно, в этом случае для OP более удобно использовать ['KeyChar'] (http://msdn.microsoft.com/en-us/library/system.consolekeyinfo.keychar (v = vs.110) .aspx). –