3

だから、私はこのコードを書いて、それは私にエラーを与えます. (コンストラクター呼び出しは、インスタンス コンストラクターの最初のステートメントとしてのみ有効です。)

Public Class PossibleMove
    Public importance As Integer
    Public x1,y1,x2,y2 As Integer
    Public match As Match

    Public Sub New(ByVal _PossibleMove As PossibleMove)
        With _PossibleMove
            Me.New(.x1, .y1, .x2, .y2, .match)  'Gives an error
        End With
    End Sub

    Public Sub New(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer, ByVal _Match As Match)
        Me.importance = 0
        '  ...
    End Sub
End Class

私がWith _PossibleMove物を取り除くと、それは期待どおりに機能するので、それほど問題ではありません. 問題は、次のコードでエラーが発生しないことです。これは、必然的に同じことですが(??)

Public Class Match

    ' Data members...

    Public Sub New(ByVal _Match As Match)
        With _Match
            Me.New(.xBegin, .xEnd, .yBegin, .yEnd, .triggerX, .triggerY, .color)
            '  No error here!  ^^^
        End With
    End Sub

    Public Sub New(_xBegin As Integer, _xEnd As Integer, _yBegin As Integer, _yEnd As Integer, _triggerX As Integer, _triggerY As Integer, _Color As Integer)
        Me.xBegin = _xBegin
        ''' More stuff here...
    End Sub
End Class

コードの 2 番目のブロックがコンパイルされるのに、最初のブロックがコンパイルされない理由を誰か教えてください。

また、コンストラクター呼び出しが最初のステートメントでなければならないのはなぜですか? ありがとう。

編集 :

Match クラスには、データ メンバーとしてクラスがありますか? そうでないなら、それが原因だと思います。PossibleMove の最初のコンストラクターは一致オブジェクトを構築する必要があるため、Me.New は最初に行われるわけではありません。– ブライアン・フーパー

マッチ クラスには「ユーザー定義オブジェクト」タイプのデータ メンバーがないため、おそらくあなたの推測は正しいでしょう。しかし、その場合は、それを削除してもコードはコンパイルされませんWith _PossibleMove。なぜなら、その場合でも、一致オブジェクトが構築されているためMe.New()、最初に行われるわけではないからです。With _PossibleMoveそして、そうではありません(つまり、を削除してに変更するとコンパイルされMe.New(_PossibleMove.x1, _PossibleMove.y1, _PossibleMove.x2, _PossibleMove.y2, _PossibleMove.match)ます。

4

0 に答える 0