Возможности С#.NET 3.0/3.5 в версии 2.0 с помощью Visual Studio 2008
Каковы некоторые новые функции, которые можно использовать в .NET 2.0, которые относятся к С# 3.0/3.5 после обновления до Visual Studio 2008? Кроме того, какие функции недоступны?
Доступные
- Лямбда
- Методы расширения (путем объявления пустого System.Runtime.CompilerServices.ExtensionAttribute)
- Автоматические свойства
- Инициализаторы объектов
- Инициализаторы коллекции
- LINQ to Objects (путем реализации методов расширения IEnumerable, см. LinqBridge)
Недоступно
- Деревья выражений
- Библиотеки WPF/Silverlight
Ответы
Ответ 1
Вы можете использовать любую новую функцию С# 3.0, которая обрабатывается компилятором, испуская совместимый с 2.0 IL-код и не ссылаясь ни на одну из новых сборок 3.5:
- Lambdas (используется как
Func<..>
, not Expression<Func<..>>
)
- Методы расширения (путем объявления пустого System.Runtime.CompilerServices.ExtensionAttribute)
- Автоматические свойства
- Инициализаторы объектов
- Инициализаторы коллекции
- LINQ to Objects (путем реализации методов расширения IEnumerable <T> см. LinqBridge)
Ответ 2
Довольно многое! Даниэль Моф описывает здесь здесь и здесь. Это только оставляет поддержку во время выполнения: LINQ-to-Objects предоставляется LINQBridge - который оставляет только большие API, такие как поддержка Expression, и инструменты, подобные LINQ к SQL. Они слишком велики, чтобы их можно было портировать обратно в .NET 2.0, поэтому я бы использовал .NET 3.5 для них.
Ответ 3
Я расскажу об этом в статье на моем сайте.
Почти все возможности С# 3.0 доступны при настройке .NET 2.0. Для методов расширения вам необходимо определить дополнительный атрибут. Деревья выражений вообще недоступны. Поддержка выражения запроса основана на переводе, за которым следуют "обычные" правила С#, поэтому вам нужно что-то предложить для методов Select, Where и. LINQBridge является фактическим стандартом "LINQ to Objects in.NET 2.0". Возможно, вам захочется объявить делегатов из семейств делегатов Func
и Action
, чтобы упростить работу с лямбда-выражениями, а затем удалить их, если при перемещении в .NET 3.5
Ответ 4
Чтобы определить методы расширения, вам необходимо предоставить следующий класс, если вы настроили таргетинг на .NET 2.0:
namespace System.Runtime.CompilerServices {
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
sealed class ExtensionAttribute : Attribute { }
}
Ответ 5
Было предыдущее обсуждение того, что вы также можете прочитать:
Ориентация .NET Framework 3.5, использующая .NET 2.0 Runtime. Предостережения?
Ответ 6
Вы можете использовать Mono версию System.Core, которая полностью поддерживает LINQ и Expression Trees.
Я собрал его источник против .net 2.0, и теперь я могу использовать его в моих проектах .net2.0.
Это отлично подходит для проектов, которые необходимо развернуть на win2k, где .net3.5 недоступен.
Ответ 7
Методы Lambdas и Extension обрабатываются исключительно компилятором и могут использоваться с картой .Net 2.0.