在Visual Studio 2015 RC中的接口上出现"Visual Basic 9.0不支持自动实现的属性"错误

Daz*_*Daz 16 vb.net asp.net visual-studio-2015

我已经开设了一个网站项目,该项目之前是在2015年RC的Visual Studio 2012中开发的.该项目的目标是.net 3.5.

我定义了这个接口:

Public Interface ICurrentStep
    Property outerstep() As String
    Property innerstep() As String
End Interface
Run Code Online (Sandbox Code Playgroud)

我为每个属性得到以下构建错误:"BC36716 Visual Basic 9.0不支持自动实现的属性."

我不明白为什么Visual Studio 2012对此非常满意,但2015年并非如此.在xcopy和已发布的版本中,该网站在.net 3.5下运行良好.

我也不明白如何以其他方式定义界面.这可能是2015/Roslyn的错误吗?

定位.net 4.0确实消除了问题,但由于某些外部依赖性,目前这不是部署的选项.我认为这是因为幕后它的目标是不同的编译器是否可以强制Visual Studio 2010使用Visual Basic 10?

Raf*_*eto 24

在我的例子中,使用VS2015社区,真正的问题是属性头和Get方法之间的空白行.请参阅下面的屏幕截图:

之前:( 错误图像)

在此输入图像描述

之后:( 没有错误图像)

在此输入图像描述

  • 这也是我的问题.虽然VS2012编译器本身没有"Get"之前的额外空格(或注释或属性)的问题,但当LangVersion设置为11(VS2012)时,VS2015编译器(Roslyn)会成为问题. (2认同)
  • 就我而言,有一条评论,但我也删除了整行,一切都很好。 (2认同)

Dam*_*ver 9

这确实似乎是Roslyn编译器中的一个错误.编译器以奇数模式运行,其中检查(但不是真正编译)其中的代码App_Code- 该代码实际上在站点启动时被编译.

因为它知道你已经设置了在v3.5下运行的代码,所以它假定代码实际上是由"v2.0"编译器编译的,所以它有效地运行了check/compile,就好像你已经指定了/langversion标志为9.

所以,这就是为什么错误消息是在谈论Visual Basic 9不支持的东西.但是,如果你用真正的VB9编译器编译代码,它当然编译得很好.

作为编译器相当困惑的证据,我将您的示例更改为:

Public Interface ICurrentStep
    Property outerstep() As String = "Hello"
    Property innerstep() As String
End Interface
Run Code Online (Sandbox Code Playgroud)

这应该产生一个关于不允许接口中的初始化器的错误.但是,而不只是两个错误消息,指出"Visual Basic 9.0不支持自动实现的属性".我们得到错误"扩展属性无法初始化.".但是,这没有意义:

在某些情况下,您无法使用自动实现的属性,而必须使用标准或扩展的属性语法.

也就是说,一个单一的财产可以要么是自动实现的或已展开.


我的建议是尽可能多地移动代码App_Code- 无论是在其外部还是在不同的库中.这将意味着代码实际上是由Roslyn编译器直接编译的(并且没有/langversion设置),并且您实际上可以开始使用现代VB功能(您仍然可以使用v3.5但使用以后的语言功能)

或者,您可以保留代码App_Code并选择忽略错误.如果只是两个错误,那么在短期内这可能是可行的.


小智 5

我有一个项目正在从VS2008转向使用VS2015.我们需要在短期内支持这两种环境,因此我创建了VS015 .vbproj文件,其中包含文件PropertyGroup部分中的指令9.

我收到此错误是因为Property声明和Get子句之间存在注释.例如

Private ReadOnly Property MemberNode() As XmlNode</br>
    ' This is the only place which locates the objMember node
    Get
        Return CreatePathAndNode(mnodMessage, "objData/colMember/objMember")
    End Get 
End Property
Run Code Online (Sandbox Code Playgroud)

在"Private Readonly"行之前移动注释会删除VS2015中的编译器错误.