投稿者 しまも  (社会人) 投稿日時 2023/1/12 12:02:27
はじめまして、VBを勉強し始めて1年弱の初心者(素人、趣味)です。
自前の外国語の単語帳ソフトを作りたくて、このサイトで勉強しながら少しずつ作ってきました。
ある程度できてきたのですが、突然、今まで使えていた拡張メソッドがエラーになってしまいました。

エラーになったのはDataTableの拡張メソッド(MaxNumberとMinimumLackedNumber)です。
お恥ずかしいですがコードを示します。

(呼び出し側) ★のところが赤波線のエラーに。
------------------------------------------------------------------------------------------
Public Class DBBookOperation

(略)

    '新しい本の登録。
    Public Sub AddBook(newBookName As String)

        Dim dtBook = BookDataTable()

        '最小欠番を探し、新しい本のコードに充てる。
        Dim bookCode As Integer = dtBook.MinimumLackedNumber("bookCode") ★
        'それが最大値以上を超えていたら、登録不可。
        If bookCode > CODE_MAX Then
            MsgBox("Database Full. No more book can be registered.")
            Return
        End If

        'showOrder(表示順)の最大値を調べる。新しい本のshowOrderはそれに1を加える。
        Dim showOrder As Integer = dtBook.MaxNumber("showOrder") + 1 ★

        Dim cvBookCode = New DBColumnValuePair(MyBase.Language, "tblBook", "bookCode", bookCode)
        Dim cvBookName = New DBColumnValuePair(MyBase.Language, "tblBook", "bookName", newBookName)
        Dim cvShowOrder = New DBColumnValuePair(MyBase.Language, "tblBook", "showOrder", showOrder)

        SqlInsert("tblBook", {cvBookCode, cvBookName, cvShowOrder})
        Renumber()

    End Sub

(略)
End Class

(拡張メソッド定義)
------------------------------------------------------------------------------------------
Public Module DatatableExtensions
    ''' <summary>
    '''     ''' DataTableの特定列の最大値を返す。
    ''' </summary>
    ''' <param name="dt"></param>
    ''' <param name="column"></param>
    ''' <returns></returns>
    <System.Runtime.CompilerServices.Extension>
    Public Function MaxNumber(dt As DataTable, column As String) As Integer

        If dt.Rows.Count > 0 Then
            Return Aggregate r In dt Into Max(CInt(r.Item(column)))
        Else
            Return 0
        End If
    End Function

    ''' <summary>
    ''' DataTableの特定列の最小欠番を返す。
    ''' </summary>
    ''' <param name="dt"></param>
    ''' <param name="column"></param>
    ''' <returns></returns>
    <System.Runtime.CompilerServices.Extension>
    Public Function MinimumLackedNumber(dt As DataTable, column As String) As Integer
        Dim max = MaxNumber(dt, column)
        Dim numbers = From r As DataRow In dt.Rows
                      Let n = r.Item(column)
                      Order By n
                      Select n
        Dim v As Integer = 1
        For i = 0 To max + 1
            If numbers(i) <> i Then
                v = i
                Exit For
            End If
        Next
        Return v
    End Function

(略)
End Module

出たのは次のようなエラーです。
------------------------------------------------------------------------------------------
BC30521
これらの引数に最も固有な、アクセス可能な'MaxNumber'がないため、オーバーロードの解決に失敗しました:
'DataTableExtensions'で定義された拡張メソッド'Public Function MaxNumber(column As String) As Integer:最も固有ではありません。
'DataTableExtensions'で定義された拡張メソッド'Public Function MaxNumber(column As String) As Integer:最も固有ではありません。

BC30521
これらの引数に最も固有な、アクセス可能な'MinimumLackedNumber'がないため、オーバーロードの解決に失敗しました:
'DataTableExtensions'で定義された拡張メソッド'Public Function MinimumLackedNumber(column As String) As Integer:最も固有ではありません。
'DataTableExtensions'で定義された拡張メソッド'Public Function MinimumLackedNumber(column As String) As Integer:最も固有ではありません。


------------------------------------------------------------------------------------------

さらに、これらメソッドがインテリセンスで次のように表示されます。

<拡張> Function MaxNum(column As String) As Integer (+1オーバーロード)
<拡張> Function MinimumLackedNumber(column As String) As Integer (+1オーバーロード)

どうやら、同じメソッドが二つあるかのように認識されている(?)ようなのですが……
しかし、オーバーロードは作っていませんし、隅々まで確認しましたが同じものをコピーしたりもしていません。
また、上記の部分は直近ではまったくいじっていません。
何より今まで動かせていたのが急に動かなくなり途方に暮れています。

原因や対処について教えていただけたら幸いです。