Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Constructor Overloading with Default Parameters

I accidentally overloaded a constructor in C# as follows:

public MyClass(string myString) 
{
    // Some code goes here 
}

public MyClass(string myString, bool myParameter = false) 
{
   // Some different code here
}

With this code my project compiled fine. If I call the constructor with just a string argument, how does C# decide which constructor I want to use? Why is this functionality syntactically allowed?

like image 353
cytinus Avatar asked Jul 20 '12 18:07

cytinus


People also ask

Can constructor have default parameters?

Like all functions, a constructor can have default arguments. They are used to initialize member objects. If default values are supplied, the trailing arguments can be omitted in the expression list of the constructor.

Can parameterized constructor be overloaded?

In Java, we can overload constructors like methods. The constructor overloading can be defined as the concept of having more than one constructor with different parameters so that every constructor can perform a different task.

How many parameters can be passed using default constructors?

There are no parameters accepted by default constructors. The compiler will give an implicit default constructor if the programmer does not explicitly provide one. In that scenario, the variables' default values are 0.

What are the rules for constructor overloading?

Constructor overloading in Java refers to the use of more than one constructor in an instance class. However, each overloaded constructor must have different signatures. For the compilation to be successful, each constructor must contain a different list of arguments.


1 Answers

Why is this functionality syntactically allowed?

In terms of the IL generated, the second constructor is still two arguments. The only difference is that the second argument has an attribute providing the default value.

As far as the compiler is concerned, the first is still technically a better fit when you call a constructor with a single string. When you call this with a single argument, the best match is the first constructor, and the second will not get called.

The C# specification spells this out. In 7.5, it states "... instance constructors employ overload resolution to determine which of a candidate set of function members to invoke." The specific rules are then specified in 7.5.3.2, where this specific rule applies:

Otherwise if all parameters of MP have a corresponding argument whereas default arguments need to be substituted for at least one optional parameter in MQ then MP is better than MQ.

In this case, MP (your first constructor) has all arguments, but MQ (your second) needs "at least one optional parameter."

like image 53
Reed Copsey Avatar answered Oct 19 '22 01:10

Reed Copsey