Why does Console.ReadKey().Key.ToString get lower and uppercase Letter by pressing once?

2.9k Views Asked by At

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'?

4

There are 4 best solutions below

0
On BEST ANSWER

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().

0
On

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.

0
On

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.

enter image description here

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.

0
On

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();