3

私は Visual Basic 6.0 にあまり詳しくなく、VB コンパイラをインストールしていませんが、デバッグ用の VB コードを調べていたところ、次のように表示されました。

Private Function IsFieldDeleted(oLayoutField As Object)
    Dim oColl As Collection
    Set oColl = GetFieldIdsForField(oLayoutField)

    IsFieldDeleted = (oColl.Count = 0)

    Set oColl = Nothing
End Function

他の関数では、「As Boolean」などの「As」を使用して戻り値の型を定義していることがわかりますが、これには「As」:D がなく、どのように使用したかは次のようになります。

  If Not IsFieldDeleted(oRptField.GetUCMRLayoutField) Then
      Call oCollection.Add(oRptField, oRptField.ObjectKeyString)
      Call AddToNewLineSeperatedString(sCaseFldDescMsg, oFld.FieldDescription)
  End If

これはどのように機能していますか?それを書き直して、関数が整数を返し、戻り値の型を比較して 0 または 1 のいずれかであると言っているようなものですか? それとも、他に隠れたヒントがありますか?

4

1 に答える 1

4

型が指定されていない場合、VB.NET ではObject戻り値の型が想定されます。VB6では、 を想定していますVariant。VB.NET では、 を回すことで物事をより明確にすることOption Strict Onができますが、そのオプションが VB6 で利用可能だったとは思いません。

実際には、返される値は として入力されBooleanますが、返される値は として表示されますVariant。したがって、「適切に」行うには、次のように戻り値をキャストする必要があります。

If Not CBool(IsFieldDeleted(oRptField.GetUCMRLayoutField)) Then
   ....
End If

を呼び出すと、値が aではなくa にCBoolキャストされます。ただし、VB は遅延バインディングを使用して戻り値の型がブール値であると判断するため、これは不要です。BooleanVariant

この場合の最善の方法は、関数を に変更することAs Booleanです。とにかくそれが返されたすべてであるため、そうしても既存のコードが壊れることはありません。ただし、それが DLL のパブリック メンバーである場合、互換性が失われます。

于 2012-12-12T21:31:08.520 に答える