使用Visual Studio 2008在C# .NET 2.0中实现C# .NET 3.0/3.5功能

13

如果升级到Visual Studio 2008,有哪些针对C# 3.0/3.5的新特性可以使用?另外,有哪些特性是不可用的?

可用的特性:

  • Lambdas(Lambda表达式)
  • Extension methods(扩展方法,通过声明空的System.Runtime.CompilerServices.ExtensionAttribute实现)
  • Automatic properties(自动属性)
  • Object initializers(对象初始化器)
  • Collection Initializers(集合初始化器)
  • LINQ to Objects(通过实现IEnumerable扩展方法,参见LinqBridge

不可用的特性:

  • Expression trees(表达式树)
  • WPF/Silverlight库

通过使用Mono,可以使用表达式树。请参见下面的答案。 - Omer Mor
7个回答

16

您可以使用任何C# 3.0新功能,只要编译器处理它们并发出与2.0兼容的IL,并且不引用任何新的3.5程序集:

  • 匿名函数(作为 Func<..> 使用,而不是Expression<Func<..>>
  • 扩展方法(通过声明一个空的System.Runtime.CompilerServices.ExtensionAttribute
  • 自动属性
  • 对象初始化
  • 集合初始化
  • 针对对象的LINQ查询(通过实现IEnumerable<T> 扩展方法,参见LinqBridge

5
几乎所有的东西!Daniel Moth在这里这里进行了介绍。这只留下了运行时支持:LINQ-to-Objects由LINQBridge提供,剩下的只有像表达式支持这样更大的API,以及像LINQ-to-SQL这样的工具。它们太大了,无法合理地移植回.NET 2.0,所以我会使用.NET 3.5。

5

我在我的网站上撰写了一篇文章,详细介绍了这个问题:点击查看

当针对.NET 2.0进行开发时,几乎所有C# 3.0功能都是可用的。但对于扩展方法,您需要定义一个额外的属性。表达式树则完全不可用。查询表达式支持是基于翻译,然后遵循“正常”的C#规则,因此您需要某些东西来提供Select、Where等方法。 LINQBridge 是事实上标准的“LINQ to Objects in .NET 2.0”实现。您可能希望声明FuncAction委托系列中的委托,以便更轻松地使用lambda表达式,然后在转到.NET 3.5时将其删除。


3

如果你的目标是.NET 2.0,想要定义扩展方法,需要提供以下类:

namespace System.Runtime.CompilerServices {
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
    sealed class ExtensionAttribute : Attribute { }
}

我也不得不这样做(在另一个网站上发现你建议这样做),才能在一个3.5 SP1项目中使用Ninject 1.0来代替2.0。非常奇怪... - Ruben Bartelink

2

2
您可以使用Mono的System.Core版本,它完全支持LINQ和表达式树。 我将其源代码编译为.net 2.0,并且现在我可以在我的.net2.0项目中使用它。 这对于需要部署在win2k上的项目非常有用,因为.net3.5不可用。

这些表达式树需要 .Net 2.0 SP1 吗? - Lucas
不是的。只是普通的.NET 2.0版本。即使在Win2k机器上也能很好地运行。 - Omer Mor

1

Lambdas(Lambda表达式)和Extension methods(扩展方法)完全由编译器处理,可以与.Net 2.0框架一起使用。


1
Lambda作为委托,没问题。但是Lambda作为表达式则依赖于.NET 3.5中的Expression类。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接