8

我很想知道在C#4中引入的可選參數是否向後兼容?C#4中的可選參數是否向後兼容?

讓我用一個簡單的例子來說明我的問題。假設我寫在C#4下面的代碼放在.NET2在VS2010:

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 
    

我應該如何調用C#2項目中的C#4方法?

回答

9

它只是一種方法 - C#編譯器不會創建重載。這就好像你調用一個在VB.NET中用可選參數創建的方法 - 它們從一開始就一直在.NET中。只是C#2編譯器不知道如何處理它們,所以你必須自己指定所有的參數。

基本上可選的參數只會改變方法的調用方式。如果有這樣的方法:

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

,你這樣稱呼它:

Foo(15); 

的C#4編譯器將改變調用方:

Foo(15, 20); 

的C# 2編譯器不能這樣做,所以你必須指定兩個參數。

+0

非常感謝。它澄清了我的問題。謝謝。 – 2010-07-14 03:38:35

9

您會看到一個包含所有參數的方法。

在C#4和VB的每個版本中使用可選參數的方法都被編譯爲一個具有CIL元數據的單一方法,該方法指示哪些參數是可選的以及它們的默認值是什麼。
C#3(編譯器和Visual Studio的IntelliSense都會忽略此元數據)。

欲瞭解更多信息,請參閱here