根据 MSDN 文档,Console.Read 方法返回:
输入流中的下一个字符,如果当前没有要读取的字符,则为负数 (-1)。
所以,实际上您所看到的只是当前流中的第一个字符(即,在最后两次 Enter 推送之间接收到的字符)。
在您的单元测试期间,这些值似乎被移动了 48,因为碰巧从 '0' 到 '9' 的字符的 ASCII 值是,你猜对了,48 代表 '0', 49 代表“1”等:
由于您没有指定转换,因此流内容“自动”读取为 char 值,并且您对 Read() 的调用显示了它们的 ASCII 十进制等效值。
您可以使用这个简单的测试来验证这一点:
static void TestRead()
{
int current = 0;
Console.Write("Enter 1: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
Console.Write("Enter 22: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
}
这将导致:
您会注意到对Read() 的背靠背调用会从流中获取单个字符,并为您提供其 ASCII 十进制等效值。另外,请注意 Windows 如何为 Enter 键的每个笔划附加回车 (ASCII 13) 和换行 (ASCII 10) 序列,您的程序会忠实地回显给您。
对该测试方法稍作修改将有助于说明缺乏特定方向的观点,运行时会将输入流的内容解释为字符:
static void TestReadModified()
{
int current = 0;
Console.Write("Enter a: ");
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
current = Console.Read();
Console.WriteLine("Next char: {0}", current);
}
如预期的那样,上面的方法将返回字符'a'的ASCII值:
正如其他人已经提到的,这很容易解决。只需通知运行时您希望将该值解释为int。至少检查接收到的输入是否是一个数字可能也是一个好主意:
static void readPerson(out string name, out int age)
{
Console.Write("Enter name: ");
name = Console.ReadLine();
Console.Write("Enter age: ");
// in this case, we could simply use tempAge (defaults to 0)
// but it's just practice to check TryParse's success flag
int tempAge;
var success = Int32.TryParse(Console.ReadLine(), out tempAge);
age = success ? tempAge : 0;
Console.WriteLine("Name: {0}; Age: {1}", name, age);
Console.ReadLine();
}