Many languages have a very strict definition of what a keyword is. The word "for" has a specific meaning, and you can't use it anywhere else in the program.

C# does have this kind of keyword - you can find the usual list of keywords in the docs - but it also has what is known as a contextual keyword, where a word functions like a keyword, but only in specific situations.

Contextual keywords are a way to expand the number of keywords you can use without infringing into the identifier space of the user.

One of the best examples is the set accessor of a property, which typically looks something like this:

string Name
{
    set { name = value; }
}

In the set accessor, you need to have a way to indicate the value the user assigned to the property. This could (perhaps - I haven't thought about it deeply) have been done with some weird concatenation of symbols, such as "<|", but C# isn't Perl, so it made more sense to use a word, and "value" is easy to understand.

But people use "value" as a variable name ALL THE TIME, and they're not going to be happy if you steal it, especially for a small feature.

So, instead of making "value" a true keyword, you make it a contextual keyword. In this case, "value" is reserved only within a set accessor, but you can freely use it elsewhere.