Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
拡張メソッドが突然エラーに
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30833#CommentId85596
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2023/1/19 03:50:31
=====
(3) 型の不整合について
-----
コード中に、いわゆる「暗黙の型変換」が散見されます。
DatabaseOperation クラス - Function SqlSelect
現行版:Dim rd = command.ExecuteScalar
修正案:Dim rd = DirectCast(command.ExecuteScalar(), T)
DBSectionOperation クラス
現行版:Private Property BookCode
変更案:Private Property BookCode As Integer
現行版:Friend Sub AddPluralSections(newSectionName, newNote, dtSection)
変更案:Friend Sub AddPluralSections(newSectionName As String, newNote As String, dtSection As DataTable)
ExampleToHtml クラス
現行版:Protected Overloads Function SetBaseText(sourceDt As DataTable, language As Language)
変更案:Protected Overloads Function SetBaseText(sourceDt As DataTable, language As Language) As String
DBSectionOperation クラス - Function WordsInTheSection
現行版:Return (From r As DataRow In dt.Rows Select CStr(r.Item("entry"))).ToList
変更案1:Return (From r In dt Select CStr(r.Item("entry"))).ToList()
変更案2:Return (From r In dt.AsEnumerable() Select CStr(r.Item("entry"))).ToList()
変更案3:Return (From r In dt.Rows.OfType(Of DataRow)() Select CStr(r.Item("entry"))).ToList()
→元のコードだと、Object 型から DataRow 型への暗黙のボックス化解除が発生してしまいます。
変更案の方法であれば最初から DataRow 型のまま取り出せるので、r As DataRow と書く必要がありません。
DefinitionToHtml クラス - Property ModifyingWays
現行版:New HowToModify({italic}, ("⇒", ""))
変更案1:New HowToModify({italic}, ("⇒"c, " "c))
変更案2:New HowToModify({italic}, ("⇒"c, ControlChars.NullChar))
→ここはちょっと悩みどころ。
まず、Char 型に対するリテラルは「"⇒"」ではなく「"⇒"c」表記です。
そして Char 型は常に「1文字」なので、「0文字」である "" や、2文字以上の文字列は渡せません。
もしも 0 文字や 2 文字などにすることがあり得るのであれば、
As Char ではなく As String で受ける必要があるでしょう。
ですから実際には、上記訂正案のように呼び出し側を Char 表記に揃えるのではなく、
呼び出される側となる HowToModify クラスの方を
「parenthes As (Char, Char)」→「parenthes As (String, String)」
に揃えることを検討すべきかと思います。
DBColumn 構造体のコンストラクタ
現行版:Me.Language = language
修正案1:Me.Language = $"{language:D}"
修正案2:Me.Language = language.ToString("D")
修正案3:Me.Language = CStr(language) '非推奨
→右辺の値が Language.French の場合、現行版(暗黙の型変換時)では、左辺には "2" がセットされます。
もしも左辺を "French" 表記にしたい場合は、D 書式の代わりに G 書式を使います。
DataGridViewCheck クラス - Function HasDgvError
現行版:Where clms.Language = language AndAlso
修正案1:Where System.Enum.Parse(GetType(Language), clms.Language) = language AndAlso
修正案2:Where CInt(clms.Language) = language AndAlso
修正案3:Where clms.Language = language.ToString("D") AndAlso
修正案4:Where clms.Language = $"{language:D}" AndAlso
→現行版は、比較式の左辺が String、右辺が列挙型で不一致であるため、
「Where CDbl(clms.Language) = CDbl(language) AndAlso」相当に暗黙変換されています。
→上記はいずれも、clms.Language に "2" などがセットされていることを前提としております。
ただし修正案1 だけは、"2" の場合と "French" の場合の両方に対応することができます。
DataGridViewCheck クラス - Function CellErrorResult
現行版:Dim isNull = Function(value) value Is Nothing OrElse value.ToString = ""
修正案1:Dim isNull = Function(value As Object) value Is Nothing OrElse value.ToString() = ""
修正案2:Dim isNull As Func(Of Object, Boolean) = Function(value) value Is Nothing OrElse value.ToString() = ""
修正案3:Dim isNull = Function(value As Object) String.IsNullOrEmpty(value?.ToString())
→現行版だと value の型が定まりません(Object 扱い)ので、As 句で明示しておくか、もしくは型推論が可能な状態にします。
他にも、多数の「暗黙の型変換」に頼ったコードが見受けられましたので、一時的にでも
「Option Strict On」にしてみて、不自然な箇所を炙り出した方が良いでしょう。