views:

165

answers:

2

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?

+6  A: 

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.

Jon Skeet
Thanks a lot. It clarifies my question. Thank you.
Anindya Chatterjee
+8  A: 

You will see a single method which has all of the parameters.

Methods with optional parameters in C# 4 and every version of VB are compiled as a single method with CIL metadata indicating which parameters are optional and what their default values are.
C# 3 (both the compiler and Visual Studio's IntelliSense) ignores this metadata.

For more information, see here.

SLaks