質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

2754閲覧

なぜコンパイルエラーにならないか

heart_crimson

総合スコア15

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2019/04/23 09:52

編集2019/04/24 04:54

前提・実現したいこと

プログラムを組んでいる際、例外に遭遇しました。
例外の原因は「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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/04/23 09:56

MyClass の定義も載せてください。何を継承してどんなインターフェースを実装しているかがわかる部分だけで結構です。
mather

2019/04/23 10:02

{ } の対応関係が合っていないようですが、質問にあたって一部定義を変更しましたか?
heart_crimson

2019/04/23 10:53

MyClass、MyClassのプロパティで使用しているクラスのコードを記載しました。 {}につきましては、プログラム修正後に追加した部分が残っており、}が多かったです。現在のプログラムが正です。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2019/04/23 11:05

「IEnumerable(Of MyClass)を引数とするメソッドにIntegerを投げれば実行前に教えてくれる」というのは コンパイル前に、ご自身が使用されているエディタに警告が表示されるということでしょうか?
imihito

2019/04/23 11:17

Option Strict の設定は何になっていますか?
heart_crimson

2019/04/24 00:27

>「IEnumerable(Of MyClass)を引数とするメソッドにIntegerを投げれば実行前に教えてくれる」というのは >コンパイル前に、ご自身が使用されているエディタに警告が表示されるということでしょうか? 赤線のエラーが表示されます。実行前にエラーが出て実行できないです。 >Option Strict の設定は何になっていますか? Offになっていました。 聞いたことのない設定だったので調べてみましたが、Offだと縮小変換をした時に通知しない、というものなのでしょうか。これのせい? 非常に参考になる情報ありがとうございます。
Zuishin

2019/04/24 00:30 編集

エラーになりそうですけどね。 不要な部分を省いて問題が再現する最小限のソースを一から作り、その全部を挙げてみてください。 それを元に検証します。 こちらで何も付け加えなくてもコンパイルできるものという意味です。
heart_crimson

2019/04/24 04:56 編集

最小限のソースを作成しました。ソースをコピーして手作業で名称を変更していたため、コンパイルが通らなかったですね。ご迷惑おかけし申し訳ございません。質問内容に挙げたソースでしたら、こちらの環境ではコンパイルできます。(質問通り、例外で落ちますが) よろしくお願いいたします。
Zuishin

2019/04/24 10:00 編集

すみません。SurferOnWww さんの回答でどうでしょうか? これでだめなようなら考えます。
heart_crimson

2019/04/24 09:51

Option Strictの設定をOnにすることでエラーになりました。コメントくださった皆様、ご指導いただきましてありがとうございました!
guest

回答1

0

ベストアンサー

Option Strict の設定は何になっていますか?

Offになっていました。

そのせいです。On にすればコンパイル以前にエラーが検出されます。

イメージ説明

Off になっていると、遅延バインディングが起きるようになって、オブジェクト(変数)の型を実行時に決めるため、コンパイルはできても 実行時にエラーが起きてしまいます。

デフォルトでは Off ですが、今後の開発では、今回のような問題を未然に防ぐため、必ず On にすることをお勧めします。上の画像ではソースコードに書いていますが、プロジェクトの設定で On にしたほうがよさそうです。

イメージ説明

投稿2019/04/24 01:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heart_crimson

2019/04/24 09:50

エラーになるようになりました! コメントに書きました通り、この設定の存在を知らなかったです。大変有益な情報ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問