前提・実現したいこと
プログラムを組んでいる際、例外に遭遇しました。
例外の原因は「IEnumerable(Of MyClass)を引数とするメソッドに、MyClassを投げていたため」でした。
(下記のプログラムを参照してください。)
IEnumerable(Of MyClass)を引数とするメソッドにIntegerを投げれば実行前に教えてくれるので、
同様にIEnumerable(Of MyClass)を引数とするメソッドに、MyClassを投げていたら「型が違う」と教えてくれないのだろうか? と疑問に思い、質問を立ち上げました。
- 過去はエラーを出していたが後になって実装された機能に追従して変更されたのか
- エラーにすると記述できないプログラム構文があるのか
- 設定すればエラーになるようにできるのか
- 特に理由は無いのか
参考になるサイト等、ご存知でしたらご教授いただければ幸いです。
Q.なぜ知りたいか?
A.今回のような事を二度と繰り返さないよう、知識を深めるため。
発生している問題・エラーメッセージ
型 'MyProject.MyClass' のオブジェクトを型 'System.Collections.Generic.IEnumerable`1[MyProject.MyClass]' にキャストできません。
該当のソースコード
以下が最低限動くソースです。
VB
1Module Module1 2 3 Sub Main() 4 Try 5 PrintLabel(New MyCondition With 6 { 7 .AAA = 1 8 }) 9 Catch ex As Exception 10 Console.WriteLine(ex.Message) 11 Console.ReadKey() 12 End Try 13 Console.ReadKey() 14 End Sub 15 16 Private Sub PrintLabel(ByVal condition As MyCondition) 17 Dim labelData = New My_Class With { 18 .ProductId = condition.ProductId, 19 .ProductName = condition.ProductName, 20 .AAA = condition.AAA, 21 .BBB = "2019/04/01", 22 .CCC = "2019/04/01", 23 .DDD = "2019/04/01", 24 .EEE = condition.EEE, 25 .FFF = MstTable.LabelSize.Middle, 26 .GGG = condition.GGG, 27 .HHH = 0, 28 .III = MyCondition.LabelTypeEnum.Box, 29 .JJJ = condition.JJJ, 30 .KKK = condition.KKK, 31 .LLL = condition.LLL, 32 .MMM = condition.MMM, 33 .NNN = condition.NNN, 34 .OOO = New List(Of MyDto) 35 } 36 37 PrintProductLabel(labelData) 'ここで落ちる 38 End Sub 39 40 Public Function PrintProductLabel(ByVal labelData As IEnumerable(Of My_Class)) As Boolean 41 42 Return True 43 End Function 44 45 Public Class MyCondition 46 47 Public Enum LabelTypeEnum 48 49 ''' <summary>商品</summary> 50 Product = 1 51 52 ''' <summary>商品の箱</summary> 53 Box = 2 54 55 End Enum 56 57 ''' <summary>商品ID</summary> 58 Public Property ProductId As Integer 59 60 ''' <summary>商品名</summary> 61 Public Property ProductName As String 62 63 '以降、諸事情で名称を変更しています。ご了承ください。 64 65 Public Property AAA As String 66 Public Property BBB As Decimal 67 Public Property CCC As Date 68 Public Property DDD As Date 69 Public Property EEE As Decimal 70 Public Property FFF As String 71 Public Property GGG As String 72 Public Property HHH As Decimal 73 Public Property III As String 74 Public Property JJJ As MstTable.LabelSize 75 Public Property KKK As Boolean 76 Public Property LLL As Integer 77 Public Property MMM As Integer 78 Public Property NNN As LabelTypeEnum 79 Public Property OOO As List(Of MyDto) 80 81 End Class 82 83 Public Class My_Class 84 Public Property ProductId As Integer 85 Public Property ProductName As String 86 Public Property AAA As String 87 Public Property BBB As Object 88 Public Property CCC As Object 89 Public Property DDD As Date 90 Public Property EEE As Decimal 91 Public Property FFF As Object 92 Public Property GGG As String 93 Public Property HHH As Integer 94 Public Property III As Object 95 Public Property JJJ As Object 96 Public Property KKK As Object 97 Public Property LLL As Object 98 Public Property MMM As Object 99 Public Property NNN As Object 100 Public Property OOO As List(Of MyDto) 101 End Class 102 103 Public Class MyDto 104 Public Property Name As String 105 106 Public Property Dose As String 107 108 Public Property Unit As String 109 End Class 110 111 Public NotInheritable Class MstTable 112 113 Private Sub New() : End Sub 114 115 ''' <summary> 116 ''' ラベルサイズ 117 ''' </summary> 118 ''' <completionlist cref="LabelSize" /> 119 <Serializable> 120 Public NotInheritable Class LabelSize 121 Inherits AbstractEnumString 122 123 ''' <summary>1:小</summary> 124 Public Shared ReadOnly Property Small As New LabelSize("1") 125 126 ''' <summary>2:中</summary> 127 Public Shared ReadOnly Property Middle As New LabelSize("2") 128 129 ''' <summary>3:大</summary> 130 Public Shared ReadOnly Property Large As New LabelSize("3") 131 132 Private Sub New(ByVal value As String) 133 MyBase.New(value) 134 End Sub 135 136 Public Overloads Shared Narrowing Operator CType(value As String) As LabelSize 137 Return New LabelSize(value) 138 End Operator 139 140 End Class 141 142 End Class 143 144 <Serializable> 145 Public Class AbstractEnumString 146 147#Region "プロパティ" 148 149 Private Property Value As String 150 151#End Region 152 153#Region "コンストラクター" 154 155 Private Sub New() : End Sub 156 157 Protected Sub New(ByVal value As String) 158 Me.Value = value 159 End Sub 160 161#End Region 162 163#Region "Public関数" 164 165 Public Overrides Function ToString() As String 166 Return Value 167 End Function 168 169#End Region 170 171#Region "演算子オーバーロード" 172 173 Public Shared Operator =(ByVal lhs As AbstractEnumString, ByVal rhs As AbstractEnumString) As Boolean 174 Return (String.Compare(lhs, rhs) = 0) 175 End Operator 176 177 Public Shared Operator <>(ByVal lhs As AbstractEnumString, ByVal rhs As AbstractEnumString) As Boolean 178 Return (String.Compare(lhs, rhs) <> 0) 179 End Operator 180 181 Public Shared Operator >(ByVal lhs As AbstractEnumString, ByVal rhs As AbstractEnumString) As Boolean 182 Return (String.Compare(lhs, rhs) > 0) 183 End Operator 184 185 Public Shared Operator >=(ByVal lhs As AbstractEnumString, ByVal rhs As AbstractEnumString) As Boolean 186 Return (String.Compare(lhs, rhs) >= 0) 187 End Operator 188 189 Public Shared Operator <(ByVal lhs As AbstractEnumString, ByVal rhs As AbstractEnumString) As Boolean 190 Return (String.Compare(lhs, rhs) < 0) 191 End Operator 192 193 Public Shared Operator <=(ByVal lhs As AbstractEnumString, ByVal rhs As AbstractEnumString) As Boolean 194 Return (String.Compare(lhs, rhs) <= 0) 195 End Operator 196 197 Public Shared Operator &(ByVal lhs As AbstractEnumString, ByVal rhs As AbstractEnumString) As String 198 If lhs Is Nothing AndAlso rhs Is Nothing Then Return String.Empty 199 If lhs Is Nothing Then Return rhs 200 If rhs Is Nothing Then Return lhs 201 Return lhs.Value & rhs.Value 202 End Operator 203 204 Public Shared Widening Operator CType(value As AbstractEnumString) As String 205 If value Is Nothing Then Return Nothing 206 Return value.ToString 207 End Operator 208 209 Public Shared Narrowing Operator CType(value As String) As AbstractEnumString 210 Return New AbstractEnumString(value) 211 End Operator 212 213#End Region 214 215 End Class 216End Module 217
試したこと
検索しようとは思ったが、上記のように説明することは出来ても
検索欄に何と入力すればいいか言語化が出来なかった。
(言語の仕様を調べる時、どのサイトを見ればよいのかor何という文言で検索すればよいのかも、ご教授いただけますと幸いです。)
補足情報(FW/ツールのバージョンなど)
.NET Framework 4.0 Client Profile
回答1件
あなたの回答
tips
プレビュー