Why does Console.ReadKey().Key.ToString get lower

2020-05-01 08:14发布

问题:

This snipet Outputs two Letters when i press one Key (r).

string key = string.Empty;
key = Console.ReadKey().Key.ToString();
Console.WriteLine(key);
Console.ReadKey();
// Output: rR

Why does it output lower 'r' and Upercase 'R' when i only press once the lowercase 'r'?

回答1:

The lower case r is what you have written from keyboard. You do not remove it form console by reading it. And the capital letter R is the character representation of the Key from ConsoleKeyInfo structure. If you want to read exactly what was written to console use Console.Read() or Console.ReadLine().



回答2:

Console.ReadKey returns the ConsoleKeyInfo object which expose a property Key which is of ConsoleKey type. Where the Key is represented with enum value With upper case letter. See below.

Now in your case, you are first reading which is r using Console.ReadKey() and they you are outputting the code using Console.WriteLine which is printing Key value as R.



回答3:

The Key-property returns a value of the enum ConsoleKey. The enum ConsoleKey has a equivalent for every non-modifier-key (Alt, Shift & Ctrl; see enum ConsoleModifiers). Therefor, there are 2 possible signs that can be produced by pressing the key "R".

Another example to illustrate this is when you press 4 in your line of numbers above the keys. This is the ConsoleKey D4. It can be (see key.KeyChar) 4 or $. Also note the property Modifiers in the ConsoleKeyInfo-class that shows the pressed modifying key.

See the example below to illustrate it:

var key = Console.ReadKey();//press 4
Console.WriteLine("ConsoleKey: " + key.Key); // D4
Console.WriteLine("Char: " + key.KeyChar); // 4
Console.WriteLine("ConsoleModifier: " + key.Modifiers); // 0

key = Console.ReadKey(); //press shift + 4
Console.WriteLine("ConsoleKey: " + key.Key); // D4
Console.WriteLine("Char: " + key.KeyChar); // $
Console.WriteLine("ConsoleModifier: " + key.Modifiers); // Shift

I've taken some information from MSDN

BTW: I only get "R" when pressing "R" or "r". I'm using C#6 with .Net 4.7. Perhaps you're using some newer or older version where it outputs all possible chars instead of the enum value itself on .ToString(), like it does @ me.



回答4:

Old question, but thought this may be useful to add.

As others have noted, Console.ReadKey() does the job of both reading your inputted key and also writing it to screen (before your Console.WriteLine() takes effect).

If you just wanted to read the input and not write it, you can use the optional bool intercept argument of Console.ReadKey() to hide the user input, and then write it later:

ConsoleKeyInfo cki = Console.ReadKey(true); // hiding input
Console.Write($"You pressed: {cki.Key}");

// press letter "a" (lower case)
// Output: You pressed: A
// i.e. no duplicated letter

Console.ReadLine();

Link to MSDN section

If you needed lowercase output, just needs a slight modification:

ConsoleKeyInfo cki = Console.ReadKey(true); // hiding input
Console.Write($"You pressed: {cki.Key.ToString().ToLower()}");
// press letter "a" (lower case)    
// Output: You pressed: a

Console.ReadLine();