Параметры по умолчанию С#

Это, наверное, очень простой ответ для кого-то. У меня есть метод с Optional Parameter следующим образом:

public static Email From(string emailAddress, string name = "")
    {
        var email = new Email();
        email.Message.From = new MailAddress(emailAddress, name);
        return email;
    }

Теперь я должен настроить таргетинг на .Net 3.5, и я понял, что Optional Parameters являются частью .Net 4. Однако мой проект строится, и я дважды проверил страницу Свойства - Приложение, которая гласит: 3.5 в качестве целевой структуры. Затем я нашел статью о MSDN, говорящую об этой функции С# 4 в VS2010. (Статья MSDN → Именованные и необязательные аргументы)

Может кто-то поможет прояснить это для меня. С# 4 не требует .Net4? Какие необязательные параметры на самом деле являются частью?

Спасибо.

Ответ 1

Дополнительные параметры поддерживаются в среде CLR с 1.0. Языки, подобные VB.Net, используют их с самого начала. Хотя первая версия С# для поддержки их - 4.0, она все равно может генерировать действительный код для 2.0 CLR и на самом деле делает это. Следовательно, вы можете использовать параметры по умолчанию в 2010 году, если вы настроите таргетинг на CLR 3.5 (или 2.0, 3.0 и т.д.)

Этот тип поддержки не ограничивается параметрами по умолчанию. Многие новые функции С# могут использоваться в старой версии фреймворка, поскольку они не зависят от изменений CLR. Вот еще несколько, которые поддерживаются в версиях CLR версии 2.0 и выше

  • Именованные аргументы: добавлен С# 4.0
  • Лямбда-выражения: добавлен С# 3.0
  • Авто Свойства: Добавлен С# 3.0
  • Методы расширения: добавлен С# 3.0
  • Co/Contra Variance: Добавлен С# 4.0

Ответ 2

Если вы скомпилируете это и просмотрите вывод с помощью инструмента, такого как ILDASM, вы увидите, что необязательный параметр просто реализуется путем добавления атрибута к метаданным, который описывает формальные параметры метода. Пока этот класс атрибутов доступен на целевой платформе, не должно быть проблем с использованием испущенного кода на платформе нижнего уровня.

Ответ 3

Языковая версия не зависит от версии фреймворка. Для С# они работают в основном параллельно, т.е. С# 4 и фреймворк 4.0 поставляются с Visual Studio 2010. (Однако нет версии 3.5 для С#.)

С VB номера версий различны, так как VB 7 была первой версией VB.NET. Таким образом, VB 10 поставляется одновременно с фреймворком 4.0.

Необязательные параметры - это языковая функция, введенная в С# 4. Когда вы используете VS 2010, вы используете С# 4, даже если вы нацеливаете фреймворк 2.0, поэтому вы можете использовать все возможности С# 4.

Ответ 4

С# 4.0 включен в Visual Studio 2010, а компилятор С# понимает необязательные параметры. Так что да, определение языка С# 4.0 отличается от .NET 4.0. Я предполагаю, что метод с дополнительными параметрами, скомпилированными для .NET 3.5, будет показывать перегруженные методы при открытии, например. VS 2008