Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is the Optional Parameter in C# 4 Backwards Compatible?

I am curious to know that whether optional parameter introduced in C#4 is backward compatible or not?

Let me clarify my question with a simple example. Suppose I write the following code in C#4 on .Net2 in VS2010:

public void Foo(int val1, int val2, int val3 = 5){ .... }

Now I compiled the code, make a dll and reference it to a C#2 / C#3 project on .Net2. In the code editor (other than VS2010, say VS2008) what I'll see in intellisense?

  1. Two overloaded methods like:

    public void Foo(int val1, int val2)
    public void Foo(int val1, int val2, int val3)
    
  2. Something else like:

    public void Foo(int val1, int val2, int val3)
    public void Foo(int val1, int val2, int val3 = 5) //VS2008 is not supposed to show this
    

How I am supposed to call the C#4 method in C#2 project?

like image 858
Anindya Chatterjee Avatar asked Jul 13 '10 20:07

Anindya Chatterjee


1 Answers

It'll just be one method - the C# compiler doesn't create overloads. It will be just as if you're calling a method created in VB.NET with optional parameters - they've been in .NET right from the start. It's just that the C# 2 compiler won't know how to deal with them, so you'll have to specify all the arguments yourself.

Basically optional parameters only change how methods are called. If there's a method like this:

public void Foo(int x = 10, int y = 20)

and you call it like this:

Foo(15);

the C# 4 compiler will change the calling side to:

Foo(15, 20);

The C# 2 compiler can't do that, so you'd have to specify both arguments.

like image 119
Jon Skeet Avatar answered Sep 28 '22 12:09

Jon Skeet