Можете ли вы использовать необязательные параметры в коде, ориентированном на .NET 3.5?

Я хочу написать библиотеку, в которой используется новая функция необязательных параметров C # 4.0, но я хочу нацелить ее на версию фреймворка 3.5. Это возможно?

Являются ли необязательные параметры синтаксическим сахаром так же, как методы расширения?


person Charles Graham    schedule 31.07.2009    source источник


Ответы (7)


С помощью VS2010 RC я смог создать приложение .NET 3.5, которое использует необязательные параметры в C #.

Так что да, все дело в синтаксическом сахаре.

person Bernard Vander Beken    schedule 01.03.2010

VS 2010 поддерживает дополнительные параметры в C # для решений .NET 3.5. Однако есть одно предостережение: компилятор командной строки будет сообщать об ошибках.

Итак, если у вас запущены автоматизированные сборки - с использованием NANT или чего-то еще с использованием компилятора командной строки - ваши сборки завершатся ошибкой.

person demius    schedule 04.06.2010
comment
Да, так что обходной путь здесь заключается в изменении вашей автоматизированной сборки для использования MSBuild, расположенного в каталоге 4.0 Framework. - person Jeff; 19.04.2012
comment
У меня та же проблема, и действительно, она не работает при запуске msbuild из командной строки. Я уже использую msbuild в каталоге 4.0 framework. Я также пробовал параметр /toolsversion:4.0 и /p:TargetFrameworkVersion=v4.5, но безуспешно! Я все время получаю ошибку CS1644! Любые идеи? - person papadi; 19.12.2013

Как и Джон Скит, я получал: «Дополнительный параметр функции нельзя использовать, потому что он не является частью спецификации языка C # 3.0». Однако в RTM-версии Visual Studio вы можете выбрать для языковой версии значение «по умолчанию» в Project Properties-> Build-> Advanced. Это заставило меня работать.

person Lee Richardson    schedule 12.07.2010

Вы можете использовать необязательные и именованные параметры в целевой структуре предыдущей версии, если сборки построены в среде разработки для v4 (например, VS2010). Но вы должны знать о компиляции или публикации веб-сайтов во время выполнения, в этом случае будет использоваться компилятор целевой платформы. А поскольку компиляторы старых фреймворков не понимают синтаксис необязательных и именованных параметров, это приведет к ошибкам компилятора.

person Frans Harinck    schedule 21.04.2011
comment
Я думаю, что то, что упоминает Франс, является важным моментом. Если вы компилируете настольное приложение, которое вызывает метод, использующий необязательные параметры, с целевой структурой более ранней версии, скажем, 2.0, в VS2012, все в порядке. Но вы не сможете создать веб-приложение с целевой структурой более ранней версии, которая вызывает тот же метод. - person heuristican; 18.04.2013

Перейдите в свойства проекта -> вкладка «Сборка» -> нажмите кнопку «Дополнительно» -> установите для языковой версии значение «по умолчанию» -> сохранить -> будьте счастливы;)

person gdbdable    schedule 30.11.2011

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

Изменить: глядя на эту ссылку (и некоторые другие), кажется, что необязательные параметры компилируются в аргументы метода с атрибутом [opt] в il. Я не знаю, существовал ли этот параметр в предыдущих версиях clr, но все же я предполагаю, что это так.

person Timothy Carter    schedule 31.07.2009
comment
Да, я бы подумал, что это так, но я не хочу устанавливать VS2010, когда это еще не RTM, если он мне этого не дает. - person Charles Graham; 31.07.2009
comment
C # 4.0 повторно использует атрибут, который VB использует для этой цели, поэтому он существует с 1.0. - person Pavel Minaev; 31.07.2009

VB.NET имеет необязательные параметры, если вы хотите использовать необязательные параметры в .NET 3.5.

person Joe Chung    schedule 31.07.2009
comment
Да, знаю. Мне нравятся необязательные параметры, но я ненавижу VB. ;) Кроме того, наличие приложения на двух языках - это своего рода кладж, если вам нужны только VB для одного или двух классов. - person Charles Graham; 31.07.2009