Почему некоторые функции C # 4 разрешены даже при нацеливании на 3.5? - PullRequest
4 голосов
/ 04 мая 2010

Мы обновились до VS 2010, но еще не обновились до .NET 4.0. Все наши проекты все еще нацелены на 3.5.

Сегодня разработчик зарегистрировал код, который выглядел так:

delegate T Generator<out T>();

Насколько я знаю, "in T" и "out T" - это особенности C # 4.0. В соответствии с нашим сервером сборки, на котором не установлен .NET 4.0, я прав. Регистрация сломала сборку. Но почему, черт возьми, это строится на его машине? Почему VS просто игнорирует целевую платформу для проекта?

Другие функции C # 4.0, такие как динамическое ключевое слово, не основаны на компьютере разработчика.

Ответы [ 4 ]

6 голосов
/ 04 мая 2010

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

4 голосов
/ 04 мая 2010

Это языковые функции, для работы которых требуется компилятор C # 4, но не платформа .NET 4.0. Поэтому, пока все машины, которые будут собираться, имеют компилятор C # 4, вы сможете использовать эти новые функции, не требуя установки дополнительных компонентов для ваших пользователей.

1 голос
/ 04 мая 2010

Некоторые из новых языковых функций не зависят от новой версии CLR. Например, вы можете использовать некоторые функции C # 3.0 при нацеливании на .NET 2.0 (методы расширения, лямбда-выражения, инициализаторы объектов или даже синтаксис запроса, если вы предоставляете реализацию для операторов Linq, как это делает LinqBridge). Эти функции зависят только от компилятора, а не от CLR (в .NET 3.5 CLR такая же, как в .NET 2.0).

Точно так же ковариация и контравариантность не зависят от .NET 4.0 CLR, они являются чисто языковой функцией, поэтому вы можете использовать модификаторы in / out, когда нацеливаетесь на .NET 3.5. С другой стороны, динамическая типизация зависит от DLR (Dynamic Language Runtime), который поставляется с .NET 4.0, поэтому вы не можете использовать dynamic при нацеливании на 3,5

1 голос
/ 04 мая 2010

Чтобы избежать этого, используйте Project + Properties, вкладку Build, прокрутите вниз, Advanced, языковая версия = "C # 3.0"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...