Параметры по умолчанию в C # - PullRequest
11 голосов
/ 30 августа 2010

Это, наверное, очень простой ответ для кого-то. У меня есть метод с 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, в которой говорится, что это особенность C # 4 в VS2010. ( Статья MSDN -> Именованные и необязательные аргументы )

Может кто-нибудь помочь уточнить это для меня. C # 4 не требует .Net4? Что являются ФАКУЛЬТАТИВНЫМИ ПАРАМЕТРАМИ ЧАСТИ?

Спасибо.

Ответы [ 4 ]

22 голосов
/ 30 августа 2010

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

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

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

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

2 голосов
/ 30 августа 2010

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

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

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

0 голосов
/ 30 августа 2010

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

...