C# provides a set of predefined struct types called the simple types. The simple types are identified through reserved words, but these reserved words are simply aliases for predefined struct types in the System
namespace, as described in the table below.
Reserved word | Aliased type |
sbyte |
System.SByte |
byte |
System.Byte |
short |
System.Int16 |
ushort |
System.UInt16 |
int |
System.Int32 |
uint |
System.UInt32 |
long |
System.Int64 |
ulong |
System.UInt64 |
char |
System.Char |
float |
System.Single |
double |
System.Double |
bool |
System.Boolean |
decimal |
System.Decimal |
A simple type and the struct type it aliases are completely indistinguishable. In other words, writing the reserved word byte
is exactly the same as writing System.Byte
, and writing System.Int32
is exactly the same as writing the reserved word int
.
Because a simple type aliases a struct type, every simple type has members. For example, int
has the members declared in System.Int32
and the members inherited from System.Object
, and the following statements are permitted:
int i = int.MaxValue; // System.Int32.MaxValue constant string s = i.ToString(); // System.Int32.ToString() instance method string t = 123.ToString(); // System.Int32.ToString() instance method
Notice in particular that integer literals are values of type int
, and therefore also values of the System.Int32
struct type.
The simple types differ from other struct types in that they permit certain additional operations:
123
is a literal of type int
and 'a'
is a literal of type char
. C# makes no provision for literals of other struct types, and values of other struct types are ultimately always created through constructors of those struct types.const
declarations it is possible to declare constants of the simple types (§10.3). It is not possible to have constants of other struct types, but a similar effect is provided by static
readonly
fields.