Why do primitive data types work without including the System namespace?
Asked Answered
D

3

19

I read that all primitives fall under the System namespace. If I comment out using System I would expect there to be a build error in my program, however it is running successfully. Why is this?

Attached the snap of my sample program.

Dric answered 8/8, 2015 at 14:20 Comment(7)
Even if you delete all namespaces, it will work :) Just a hint, if you say Int32 instead of int, it won't work.Cristie
int is an alias for System.Int32 (which you would not be able to use)Depositor
@AlexK.I am able to use int even though I comment using System;Dric
@RajeshPawde Yes because int is already System.Int32. It doesn't need any namespace because it has already. Think about like this; you are using Console.WriteLine with using System, right? What if you have System.Console.WriteLine, do you need using System for that? No, because it has already. This is the same as for System.Int32 which is aliased by int.Cristie
possible duplicate of C#, int or Int32? Should I care?Chromite
@UweKeim IMO they are related, but asking different questions fundamentally; this question also gets into the topic of using fully qualified types, without the using directiveCimon
@iliketocode Agree with you both the questions are different.Dric
C
22

It's because int is an alias for System.Int32, and since the "Int32" is already prefixed with its namespace (ie. "fully qualified"), the syntax is legal without having to specify using System; at the top of your code.

The MSDN snippet below describes this concept-

Most C# applications begin with a section of using directives. This section lists the namespaces that the application will be using frequently, and saves the programmer from specifying a fully qualified name every time that a method that is contained within is used. For example, by including the line:

using System;

At the start of a program, the programmer can use the code:

Console.WriteLine("Hello, World!");

Instead of:

System.Console.WriteLine("Hello, World!");

System.Int32 (aka "int") would be the latter. Here is an example of this in code -

//using System;

namespace Ns
{
    public class Program
    {
        static void Main(string[] args)
        {
            System.Int32 i = 2;    //OK, since we explicitly specify the System namespace
            int j = 2;             //alias for System.Int32, so this is OK too
            Int32 k = 2;           //Error, because we commented out "using System"
        }
    }
}

Since line 11 is not fully qualified / aliasing a fully qualified type, using System; would need to be uncommented for the error to go away.

Additional references-

Cimon answered 8/8, 2015 at 14:25 Comment(3)
Either my monitor's gamma is out or your vision is that of a bee ;) (color scheme)Israel
Yes.. I usually code on a black background. Just switched the colors to white, this should be a little better.Cimon
Hehe that's better. I use the dark scheme too it was just dark blue does crazy stuff to my eyes ;)Israel
C
8

As was mention before int is an alias of System.Int32 type. The alias of primitive types are implicitly known by the C# language. Here is the list:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

So, for these aliases, also known as simple types, you don't need to specify any namespace.

Carlyn answered 8/8, 2015 at 14:36 Comment(1)
In other words, "compiler magic". ++ the most on topic answer on this Q.Strawflower
K
4

When you use int, you are basically putting in System.Int32. Since this is the fully qualified type name, you don't actually need using System;

Your program would work if you did

 System.Int32 num = 0;

even without the using

Krasnodar answered 8/8, 2015 at 14:36 Comment(2)
No this will raise the compile error if we are not using the using System;Dric
@RajeshPawde no it won't. System.Int32 is fully qualified and doesn't need a using System;Camel

© 2022 - 2024 — McMap. All rights reserved.