2015RCのVisualStudio2012で以前に開発されたWebサイトプロジェクトを開きました。プロジェクトは.net3.5を対象としています。
私はこのインターフェースを定義しています:
Public Interface ICurrentStep
Property outerstep() As String
Property innerstep() As String
End Interface
プロパティごとに次のビルドエラーが発生します:「BC36716Visual Basic9.0は自動実装されたプロパティをサポートしていません。」
Visual Studio 2012がこれに完全に満足している理由はわかりませんが、2015年はそうではありません。このWebサイトは、xcopyバージョンと公開バージョンの両方で.net3.5で正常に機能します。
また、他の方法でインターフェイスを定義する方法もわかりません。これは2015/Roslynのバグでしょうか?
.net 4.0をターゲットにすると問題は解決しますが、外部の依存関係があるため、現時点では展開のオプションではありません。これは、舞台裏で次のように別のコンパイラをターゲットにしているためだと思います Visual Studio2010にVisualBasic 10を使用させることは可能ですか?
これは確かにRoslynコンパイラのバグのようです。コンパイラは奇妙なモードで実行されており、App_Code
内のコードをチェックします(実際にはコンパイルしません)。そのコードは、サイトの起動時に実際にコンパイルされます。
コードをv3.5で実行するように設定したことがわかっているため、コードは実際には「v2.0」コンパイラによってコンパイルされると想定され、指定した場合と同様にチェック/コンパイルを効果的に実行します。 /langversion
フラグは9です。
そのため、エラーメッセージはVisual Basic 9でサポートされていないことを示しています。ただし、実際のVB9コンパイラでコードをコンパイルすると、もちろん正常にコンパイルされます。
コンパイラがかなり混乱している証拠として、サンプルを次のように変更しました。
Public Interface ICurrentStep
Property outerstep() As String = "Hello"
Property innerstep() As String
End Interface
これにより、インターフェイスで初期化子が許可されないというエラーが発生するはずです。ただし、「Visual Basic 9.0は自動実装されたプロパティをサポートしていません」という2つのエラーメッセージではなく、 alsoは、「拡張プロパティを初期化できません。」というエラーを受け取ります。しかし、これはそうではありません 意味があります :
自動実装されたプロパティを使用できず、代わりに標準または拡張されたプロパティ構文を使用する必要がある場合があります。
つまり、単一のプロパティをどちらかで自動実装または拡張できます。
私の推奨は、できるだけ多くのコードをApp_Code
から、コードのすぐ外または別のライブラリに移動することです。これは、コードが実際にRoslynコンパイラーによって直接(/langversion
設定なしで)コンパイルされ、最新のVB機能を実際に使用できるようになることを意味します(引き続きv3.5をターゲットにしますが、後で使用します言語機能)
別の方法として、コードをApp_Code
に残し、エラーを無視することを選択できます。エラーが2つしかない場合は、短期的には実行可能かもしれません。
VS2008からVS2015を使用するように移行中のプロジェクトがあります。短期的には両方の環境をサポートする必要があるため、ファイルのPropertyGroupセクションにディレクティブ9を含むVS015.vbprojファイルを作成しました。
プロパティ宣言と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
「PrivateReadonly」行の前にコメントを移動すると、VS2015のコンパイラエラーが削除されました。
これは些細でOTのように思えるかもしれませんが、Visual Studio Community 2015を使用していて、.net 3.5をターゲットにしている場合は、行の継続「_」が自動的に削除されていないことを確認してください。
VSC 2015は、編集時に行の継続を自動的に削除し、再挿入する方法はありません(VSC 2015の外部で行う必要がありました)。さらに、コンパイラーはその行にエラーを出しますが、エディターはそれを強調しません。
私の場合(VS2015、ASP.NETアプリ、VB.NET、.NET 4.6)、プロシージャ宣言とGetの間のスペースを削除することで解決しました。以下のスニペットは、「Visual Basic12.0は読み取り専用の自動実装プロパティをサポートしていません」を示しています。
Public ReadOnly Property TestProp() As Integer
Get
Return 0
End Get
End Property
以下のスニペットはそうではありません。
Public ReadOnly Property TestProp() As Integer
Get
Return 0
End Get
End Property
Public Interface ICurrentStep
Private _outerstep As String
Property outerstep() As String
Get
Return _outerstep
End Get
Set(ByVal value As String)
_outerstep = value
End Set
End Property
End Interface