投稿者 魔界の仮面弁士  (社会人) 投稿日時 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」にしてみて、不自然な箇所を炙り出した方が良いでしょう。