Является ли необязательный параметр в C # 4 обратно совместимым? - PullRequest
9 голосов
/ 14 июля 2010

Мне любопытно узнать, является ли необязательный параметр, введенный в C # 4, обратно совместимым или нет?

Позвольте мне прояснить мой вопрос на простом примере.Предположим, я пишу следующий код в C # 4 на .Net2 в VS2010:

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

Теперь я скомпилировал код, создал dll и сослался на проект C # 2 / C # 3 в .Net2,В редакторе кода (кроме 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 # 4 в проекте C # 2?

Ответы [ 2 ]

10 голосов
/ 14 июля 2010

Это будет только один метод - компилятор C # не создает перегрузок. Это будет так же, как если бы вы вызывали метод, созданный в VB.NET с необязательными параметрами - они были в .NET с самого начала. Просто компилятор C # 2 не будет знать, как с ними обращаться, поэтому вам придется самим определять все аргументы.

В основном необязательные параметры изменяют только методы вызова. Если есть такой метод:

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

и вы называете это так:

Foo(15);

компилятор C # 4 изменит сторону вызова на:

Foo(15, 20);

Компилятор C # 2 не может этого сделать, поэтому вам придется указать оба аргумента.

9 голосов
/ 14 июля 2010

Вы увидите единственный метод, который имеет все параметры.

Методы с необязательными параметрами в C # 4 и каждой версии VB скомпилированы как единый метод с метаданными CIL, указывающими, какие параметры являются необязательными и какиеих значения по умолчанию:
C # 3 (и компилятор, и IntelliSense Visual Studio) игнорируют эти метаданные.

Для получения дополнительной информации см. здесь .

...