Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
拡張メソッドが突然エラーに
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30833#CommentId85587
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
しまも
 (社会人)
投稿日時
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オーバーロード)
どうやら、同じメソッドが二つあるかのように認識されている(?)ようなのですが……
しかし、オーバーロードは作っていませんし、隅々まで確認しましたが同じものをコピーしたりもしていません。
また、上記の部分は直近ではまったくいじっていません。
何より今まで動かせていたのが急に動かなくなり途方に暮れています。
原因や対処について教えていただけたら幸いです。