C#4中的可选参数是否向后兼容?

时间:2010-07-13 20:11:00

标签: c# .net visual-studio-2008 visual-studio-2010 optional-parameters

我很想知道C#4中引入的可选参数是否向后兼容?

让我用一个简单的例子来澄清我的问题。假设我在VS2010中的.Net2上用C#4编写以下代码:

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

现在我编译了代码,制作了一个dll并将其引用到.Net2上的C#2 / C#3项目中。在代码编辑器中(VS2010除外,比如说VS2008)我会在intellisense中看到什么?

  1. 两个重载方法,如:

    public void Foo(int val1, int val2)
    public void Foo(int val1, int val2, int val3)
    
  2. 其他类似的事情:

    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
    
  3. 我应该如何在C#2项目中调用C#4方法?

2 个答案:

答案 0 :(得分:10)

它只是一个方法 - C#编译器不会创建重载。就像你在调用VB.NET中使用可选参数创建的方法一样 - 它们从一开始就在.NET中。只是C#2编译器不知道如何处理它们,所以你必须自己指定所有的参数。

基本上,可选参数只会改变方法的调用方式。如果有这样的方法:

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

你这样称呼它:

Foo(15);

C#4编译器会将调用一侧更改为:

Foo(15, 20);

C#2编译器不能这样做,所以你必须指定两个参数。

答案 1 :(得分:9)

您将看到一个包含所有参数的方法。

C#4中的可选参数和VB的每个版本的方法都被编译为单个方法,其中CIL元数据指示哪些参数是可选的以及它们的默认值是什么。
C#3(编译器和Visual Studio的IntelliSense)忽略了这些元数据。

有关详细信息,请参阅here