2010-02-19 54 views
3

我正在将VB.NET Web应用程序从Visual Studio 2005(.NET 2.0)迁移到Visual Studio 2008(.NET 3.5)虽然它大多是直截了当的,但我遇到了需要一些时间来解决的问题。为什么此代码在VS2005中编译但不是VS2008(VB.NET)

有问题的代码读取:

Dim serviceArray = New SecurityLayer.Model.Service() 
serviceArray = new SecurityLayer.SecurityBusinessController.GetServices(userId) 

在VS2005/.NET2.0哪个编译,但在VS2008/.NET3.5,出现以下错误失败:

Value of type '1-dimensional array of SecurityLayer.Model.Service' cannot be converted to 'SecurityLayer.Model.Service'

这表明serviceArray没有声明为一个数组,并且读取MSDN文档时,它看起来不像语法在版本之间发生了变化,但它指出,无论是否传入任何值,都需要大括号。果不其然,在它的声明中添加大括号可以解决问题(并且编译器会移到下一个实例!)。

Dim serviceArray = New SecurityLayer.Model.Service(){} 
serviceArray = new SecurityLayer.SecurityBusinessController.GetServices(userId) 

在更新了此声明的所有实例之后,代码现在按照预期构建并运行。

Option Explicit和Option Strict在两个IDE中都是相同的,所以它不能是(或者至少这是我所假设的)。

所以我的问题是,为什么这个内置VS2005/.NET2.0而不是VS2008/.NET3.5?

在此先感谢

回答

6

VB.NET版本9取得type inference.以前在昏暗的声明被分型,serviceArray是Object类型的。现在,编译器根据您以前的使用情况推断serviceArray是Service类型。使用相同的变量来存储不同的对象是可疑的。

+0

啊 - 现货!我通常和C#一起工作,所以不能真正加快VB.NET的速度。作为一项测试,我已经在VS2008中删除了大括号(为了生成错误),然后在课程的顶部添加了“Option Infer Off”。错误正式消失! 不用说,我没有像这样离开它,而是恢复到正确的语法。很高兴知道原因 - 谢谢。 – DilbertDave

+1

只要你在修改Option,一定要添加Option Explicit On。它捕获了许多像这样的错误。 –

+0

显式选项显式似乎在IDE中默认打开(总是值得检查) – DilbertDave

相关问题