我不明白我在这里缺少什么,但似乎Console.ReadKey()
仍处于活动状态,导致控制台在调用{{1}后使用Console.ReadLine()
时让我输入两次}}
我在选择完成后上下搜索了如何逃避Console.ReadKey()
,但无济于事。
澄清一下,这是出乎意料的行为: 当控制台弹出时,会向用户显示这三个选项作为示例。当用户输入" u"或" h",控制台不等待;它立即执行操作,而无需用户按 Enter 。
我是否在执行此操作时出错?
ReadKey()
答案 0 :(得分:5)
我使用此代码测试并获得了相同的行为:
Console.Write("Enter Selection: ");
Console.TreatControlCAsInput = true;
ConsoleKeyInfo selection = Console.ReadKey();
if (selection.Key == ConsoleKey.U)
{
Console.Write("Enter Another Value: ");
string valueStr = Console.ReadLine();
Console.WriteLine("You've entered {0}", valueStr);
}
解决方案是不使用Console.TreatControlCAsInput = true;
,因为这会导致问题。
更多信息请参阅Stack Overflow问题 TreatControlCAsInput issue. Is this a bug? 。
答案 1 :(得分:3)
关于控制台结束而不写出
"You've entered ..."
发生这种情况是因为程序在离开方法并且控制台关闭时终止。无需调试即可运行此命令( Ctrl + F5 )或在主体末尾添加Console.ReadLine()。
由于Console.ReadKey()的工作方式,控制台在第一次输入后不会等待。如果您要等待用户按 Enter ,请使用ReadLine()。
至于Console.ReadLine()在存储输入之前等待两次,那是因为你正在使用
Console.TreatControlCAsInput = true;
这与控制台内部如何接受输入有关。只是摆脱它。
答案 2 :(得分:3)
问题在于设置:
Console.TreatControlCAsInput = true;
如果你评论这一行,一切都按预期工作。这是C#中的已知功能。
如果您仍想设置Console.TreatControlCAsInput = true;您可以添加自定义方法来读取输入:
public static string CustomReadLine()
{
ConsoleKeyInfo cki;
string value = string.Empty;
do
{
cki = Console.ReadKey();
value = value + cki.Key;
} while (cki.Key != ConsoleKey.Enter);
return value;
}
更改您的代码
string value = Console.ReadLine();
使用此自定义功能
string value = CustomReadLine();
当您使用Console.TreatControlCAsInput = true时,请参阅MSDN文章 Console.TreatControlCAsInput Property 以阅读输入;