Мне любопытно знать это, обратно совместим ли дополнительный параметр, представленный в 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?
Два перегруженных метода как:
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#4 в проекте C#2?
Это будет просто один метод - компилятор C# не создает перегрузок. Это будет точно так же, как если бы вы вызывали метод, созданный в VB.NET с необязательными параметрами - они были в .NET с самого начала. Просто компилятор C# 2 не знает, как с ними работать, поэтому вам придется указывать все аргументы самостоятельно.
В основном необязательные параметры изменяют только то, как вызываются методы. Если есть метод типа this:
public void Foo(int x = 10, int y = 20)
и вы вызываете его так:
Foo(15);
компилятор C# 4 изменит вызывающую сторону на:
Foo(15, 20);
Компилятор C# 2 не может этого сделать, поэтому вам придется указать оба аргумента.
Вы увидите единственный метод, который имеет все параметры.
Методы с необязательными параметрами в C# 4 и каждой версии VB компилируются как один метод с метаданными CIL, указывающими, какие параметры являются необязательными и каковы их значения по умолчанию.
C# 3 (как компилятор, так и IntelliSense Visual Studio) игнорирует эти метаданные.
Дополнительную информацию см. в здесь.