The most basic answer is that the .NET framework designers chose to have signed integers part of the BCL (base class library) and CLS (common language syntax) specification, whereas they did not chose to make unsigned integers part of it.
For the reasoning behind that decision, ultimately you'd have to ask Microsoft. I would imagine that Eric Lippert could chime in here with a more thorough explanation.
It comes down to the following facts:
- You can't (or at least don't) have an implicit conversion between
int
and uint
, meaning that conversions must be made explicitly using cast syntax
- It's best to avoid unnecessary casting syntax if it isn't adding to the readability of the code
- The upper bounds of
int
is sufficient for most numbers that we deal with in code
Putting those together means that the int
type serves the purpose in most cases.