我很想知道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中看到什么?
两个重载方法,如:
public void Foo(int val1, int val2)
public void Foo(int val1, int val2, int val3)
其他类似的事情:
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
我应该如何在C#2项目中调用C#4方法?
答案 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。