MSIL Trivia – 3 (Constructors in .NET)


Background: Let's write the following code in C# (cons.cs)

using C = System.Console;
public class X
{
    int i, j;
    public X()
    {
    }
    public X(int i)
    {
        this.i = i;
    }
    public X(int i, int j)
    {
        this.i = i;
        this.j = j;
    }
    public void PrintValues()
    {
        C.WriteLine("i = {0}, j = {1}", this.i, this.j);
    }
}
public class Constructor_Test
{
    public static void Main()
    {
        C.WriteLine("Create an object of class X");
        X objX1 = new X(100);
        C.WriteLine("We created an object with i = 100. Let's print it now...");
        objX1.PrintValues();
        C.WriteLine("Hmm... let's create another object with i = 5 and j = 10 and print the values");
        X objX2 = new X(5, 10);
        objX2.PrintValues();
        C.WriteLine("Trying to create a new object with default constructor and print the values");
        X objX3 = new X();
        objX3.PrintValues();
    }
}

Compile it using csc, and execute it. Everything works fine. Now comment out...

    public X()
    {
    }

Try compiling again, and you will see the following...

I:\Code>csc cons.cs
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
cons.cs(34,13): error CS1501: No overload for method 'X' takes '0' arguments
cons.cs(8,9): (Location of symbol related to previous error)
cons.cs(12,9): (Location of symbol related to previous error)

That implies that you can't use

X objX3 = new X(); if you don't have a default constructor. Right?

Question> But then, how does this one work??

using C = System.Console;
public class X
{
    int i, j;
    public void PrintValues()
    {
        C.WriteLine("i = {0}, j = {1}", this.i, this.j);
    }
}
public class Constructor_Test
{
    public static void Main()
    {
        X objX3 = new X();
        objX3.PrintValues();
    }
}

Answer> Notice how the default constructor is created for you, even if you don't have a constructor defined.

image

On the other hand, if you have the default contructor and the following commented out in the first code snippet...

            X objX3 = new X();
        objX3.PrintValues();

...your cs file should compile and you get something as follows...

image

Notice that, since you have a couple of constructors defined, CSC doesn't create an empty and default constructor for you and that's the reason why you were seeing the compile error message above.

Cheers,
Rahul

Skip to main content