【问题标题】:Why does this code compile in VS2005 but not VS2008 (VB.NET)为什么这段代码在 VS2005 中编译而不是 VS2008 (VB.NET)
【发布时间】:2011-01-18 17:54:08
【问题描述】:

我正在将 VB.NET Web 应用程序从 Visual Studio 2005 (.NET 2.0) 迁移到 Visual Studio 2008 (.NET 3.5),虽然这很简单,但我遇到了一个需要一些时间才能解决的问题解决。

相关代码如下:

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

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

“SecurityLayer.Model.Service 的一维数组”类型的值无法转换为“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 中构建的?

提前致谢

【问题讨论】:

    标签: vb.net visual-studio-2008 visual-studio-2005 syntax


    【解决方案1】:

    VB.NET 版本 9 获得了type inference. 以前您的 Dim 声明是无类型​​的,serviceArray 的类型是 Object。现在,编译器从您之前的使用中推断出 serviceArray 的类型是 Service。使用同一个变量来存储不同的对象是有问题的。

    【讨论】:

    • 啊——准确!我通常使用 C#,所以在 VB.NET 方面并没有真正达到速度。作为测试,我删除了 VS2008 中的大括号(以生成错误),然后将“Option Infer Off”添加到类的顶部。错误就这样消失了!不用说,我并没有像这样离开它,而是恢复到正确的语法。很高兴知道原因 - 谢谢。
    • 只要您在修改 Option,请务必添加 Option Explicit On。它捕获了 许多 类似的错误。
    • Options Explicit 似乎在 IDE 中默认开启(尽管总是值得检查)
    • 选项显式应该始终打开。但是,要捕获这个特定问题,请尝试打开编译器检查“隐式类型;假定对象”。项目属性,编译选项卡。
    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2012-07-06
    • 2013-08-08
    相关资源
    最近更新 更多