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

Ani*_*jee 9 .net c# optional-parameters visual-studio-2010 visual-studio-2008

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

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

public void Foo(int val1, int val2, int val3 = 5){ .... }
Run Code Online (Sandbox Code Playgroud)

现在我编译代码,制作一个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)
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

我应该如何在C#2项目中调用C#4方法?

Jon*_*eet 10

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

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

public void Foo(int x = 10, int y = 20)
Run Code Online (Sandbox Code Playgroud)

你这样称呼它:

Foo(15);
Run Code Online (Sandbox Code Playgroud)

C#4编译器将调用端更改为:

Foo(15, 20);
Run Code Online (Sandbox Code Playgroud)

C#2编译器不能这样做,因此您必须指定两个参数.


SLa*_*aks 9

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

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

有关更多信息,请参阅此处.