1#If STRICT Then
2Option Strict On
3#Else
4Option Strict Off
5#End If
6
7Class TypeConversion
8    Sub M()
9        Dim out_o As Object
10        Dim out_e As System.Enum
11        Dim out_v As System.ValueType
12        Dim out_d As System.Delegate
13        Dim out_ia As IA
14        Dim out_ib As IB
15        Dim out_ic As IC
16        Dim out_sa As SA
17        Dim out_da As DA
18        Dim out_ca As CA
19        Dim out_c_ia As C_IA
20        Dim out_e_i As E_I
21
22        Dim in_o As Object
23        Dim in_ia As IA
24        Dim in_ib As IB
25        Dim in_sa As SA
26        Dim in_da As DA
27        Dim in_ca As CA
28        Dim in_c_ia As C_IA
29        Dim in_c_ib As C_IB
30        Dim in_c_ic As C_IC
31        Dim in_str As String
32        Dim in_v As System.ValueType
33        Dim in_e As System.Enum
34        Dim in_d As System.Delegate
35
36        out_ia = CType(in_str, IA)
37        out_ia = CType(in_ia, IA)
38        out_ia = CType(in_ib, IA)
39        out_ia = CType(in_da, IA)
40        out_ia = CType(in_ca, IA)
41        out_ia = CType(in_c_ia, IA)
42        out_ia = in_c_ia
43        out_ia = CType(in_c_ib, IA)
44        out_ia = in_c_ic
45        out_ia = CType(in_o, IA)
46
47        out_ic = in_c_ic
48
49        out_o = in_ia
50
51#If Not STRICT Then
52        out_e = in_o
53        out_ia = in_o
54        out_sa = in_o
55        out_ca = in_o
56        out_da = in_o
57        out_ia = in_ib
58        out_ib = in_ia
59        out_v = in_sa
60        out_sa = in_v
61        out_e_i = in_e
62        out_ca = in_ia
63#End If
64
65        out_e = Nothing
66        out_v = Nothing
67        out_d = Nothing
68        out_ia = Nothing
69        out_sa = Nothing
70        out_da = Nothing
71        out_c_ia = Nothing
72    End Sub
73
74    Sub M_InRef(ByRef in_o As Object, ByRef in_ia As IA, ByRef in_ib As IB, ByRef in_sa As SA, ByRef in_da As da, _
75          ByRef in_ca As ca, ByRef in_c_ia As c_ia, ByRef in_c_ib As c_ib, ByRef in_c_ic As c_ic, ByRef in_str As String, _
76          ByRef in_v As system.valuetype, ByRef in_d As system.delegate, ByRef in_e As system.enum)
77        Dim out_o As Object
78        Dim out_e As System.Enum
79        Dim out_v As System.ValueType
80        Dim out_d As System.Delegate
81        Dim out_ia As IA
82        Dim out_ib As IB
83        Dim out_ic As IC
84        Dim out_sa As SA
85        Dim out_da As DA
86        Dim out_ca As CA
87        Dim out_c_ia As C_IA
88        Dim out_e_i As E_I
89
90        out_ia = CType(in_str, IA)
91        out_ia = CType(in_ia, IA)
92        out_ia = CType(in_ib, IA)
93        out_ia = CType(in_da, IA)
94        out_ia = CType(in_ca, IA)
95        out_ia = CType(in_c_ia, IA)
96        out_ia = in_c_ia
97        out_ia = CType(in_c_ib, IA)
98        out_ia = in_c_ic
99        out_ia = CType(in_o, IA)
100
101        out_ic = in_c_ic
102
103        out_o = in_ia
104
105#If Not STRICT Then
106        out_e = in_o
107        out_ia = in_o
108        out_sa = in_o
109        out_ca = in_o
110        out_da = in_o
111        out_ia = in_ib
112        out_ib = in_ia
113        out_v = in_sa
114        out_sa = in_v
115        out_e_i = in_e
116        out_ca = in_ia
117#End If
118
119        out_e = Nothing
120        out_v = Nothing
121        out_d = Nothing
122        out_ia = Nothing
123        out_sa = Nothing
124        out_da = Nothing
125        out_c_ia = Nothing
126    End Sub
127
128    Sub M_OutRef(ByRef out_o As Object, ByRef out_e As system.enum, ByRef out_v As system.valuetype, ByRef out_d As system.delegate, _
129                 ByRef out_ia As ia, ByRef out_ib As ib, ByRef out_ic As ic, ByRef out_sa As sa, ByRef out_da As da, ByRef out_ca As ca, _
130                 ByRef out_c_ia As c_ia, ByRef out_e_i As e_I)
131        Dim in_o As Object
132        Dim in_ia As IA
133        Dim in_ib As IB
134        Dim in_sa As SA
135        Dim in_da As DA
136        Dim in_ca As CA
137        Dim in_c_ia As C_IA
138        Dim in_c_ib As C_IB
139        Dim in_c_ic As C_IC
140        Dim in_str As String
141        Dim in_v As System.ValueType
142        Dim in_e As System.Enum
143        Dim in_d As System.Delegate
144
145        out_ia = CType(in_str, IA)
146        out_ia = CType(in_ia, IA)
147        out_ia = CType(in_ib, IA)
148        out_ia = CType(in_da, IA)
149        out_ia = CType(in_ca, IA)
150        out_ia = CType(in_c_ia, IA)
151        out_ia = in_c_ia
152        out_ia = CType(in_c_ib, IA)
153        out_ia = in_c_ic
154        out_ia = CType(in_o, IA)
155
156        out_ic = in_c_ic
157
158        out_o = in_ia
159
160#If Not STRICT Then
161        out_e = in_o
162        out_ia = in_o
163        out_sa = in_o
164        out_ca = in_o
165        out_da = in_o
166        out_ia = in_ib
167        out_ib = in_ia
168        out_v = in_sa
169        out_sa = in_v
170        out_e_i = in_e
171        out_ca = in_ia
172#End If
173
174        out_e = Nothing
175        out_v = Nothing
176        out_d = Nothing
177        out_ia = Nothing
178        out_sa = Nothing
179        out_da = Nothing
180        out_c_ia = Nothing
181    End Sub
182
183    Sub M_InOutRef(ByRef out_o As Object, ByRef out_e As system.enum, ByRef out_v As system.valuetype, ByRef out_d As system.delegate, _
184                 ByRef out_ia As ia, ByRef out_ib As ib, ByRef out_ic As ic, ByRef out_sa As sa, ByRef out_da As da, ByRef out_ca As ca, _
185                 ByRef out_c_ia As c_ia, ByRef out_e_i As e_I, _
186                 ByRef in_o As Object, ByRef in_ia As IA, ByRef in_ib As IB, ByRef in_sa As SA, ByRef in_da As da, _
187          ByRef in_ca As ca, ByRef in_c_ia As c_ia, ByRef in_c_ib As c_ib, ByRef in_c_ic As c_ic, ByRef in_str As String, _
188          ByRef in_v As system.valuetype, ByRef in_d As system.delegate, ByRef in_e As system.enum)
189
190        out_ia = CType(in_str, IA)
191        out_ia = CType(in_ia, IA)
192        out_ia = CType(in_ib, IA)
193        out_ia = CType(in_da, IA)
194        out_ia = CType(in_ca, IA)
195        out_ia = CType(in_c_ia, IA)
196        out_ia = in_c_ia
197        out_ia = CType(in_c_ib, IA)
198        out_ia = in_c_ic
199        out_ia = CType(in_o, IA)
200
201        out_ic = in_c_ic
202
203        out_o = in_ia
204
205#If Not STRICT Then
206        out_e = in_o
207        out_ia = in_o
208        out_sa = in_o
209        out_ca = in_o
210        out_da = in_o
211        out_ia = in_ib
212        out_ib = in_ia
213        out_v = in_sa
214        out_sa = in_v
215        out_e_i = in_e
216        out_ca = in_ia
217#End If
218
219        out_e = Nothing
220        out_v = Nothing
221        out_d = Nothing
222        out_ia = Nothing
223        out_sa = Nothing
224        out_da = Nothing
225        out_c_ia = Nothing
226    End Sub
227End Class
228
229Class Intrinsic
230    Sub NumericConversionsEnum()
231        Dim e_b As e_b
232        Dim e_i As e_i
233        Dim b As Byte
234        Dim i As Integer
235#If Not STRICT Then
236        e_b = 2
237        e_i = 4
238
239        e_b = b
240        e_i = i
241        e_b = i
242        e_i = b
243        b = e_b
244        b = e_i
245        i = e_b
246        i = e_i
247        e_b = e_i
248        e_i = e_b
249#End If
250    End Sub
251
252    Sub StringConversions()
253        Dim out_b As Byte
254        Dim out_sb As SByte
255        Dim out_s As Short
256        Dim out_us As UShort
257        Dim out_i As Integer
258        Dim out_ui As UInteger
259        Dim out_l As Long
260        Dim out_ul As ULong
261        Dim out_dec As Decimal
262        Dim out_bool As Boolean
263        Dim out_sng As Single
264        Dim out_dbl As Double
265        Dim out_str As String
266        Dim out_chr As Char
267        Dim out_dt As Date
268
269        Dim in_b As Byte
270        Dim in_sb As SByte
271        Dim in_s As Short
272        Dim in_us As UShort
273        Dim in_i As Integer
274        Dim in_ui As UInteger
275        Dim in_l As Long
276        Dim in_ul As ULong
277        Dim in_dec As Decimal
278        Dim in_bool As Boolean
279        Dim in_sng As Single
280        Dim in_dbl As Double
281        Dim in_str As String
282        Dim in_chr As Char
283        Dim in_dt As Date
284#If Not STRICT Then
285        out_b = in_str
286        out_sb = in_str
287        out_us = in_str
288        out_s = in_str
289        out_ui = in_str
290        out_i = in_str
291        out_ul = in_str
292        out_l = in_str
293        out_dec = in_str
294        out_sng = in_str
295        out_dbl = in_str
296        out_dt = in_str
297
298        out_str = in_b
299        out_str = in_sb
300        out_str = in_us
301        out_str = in_s
302        out_str = in_ui
303        out_str = in_i
304        out_str = in_ul
305        out_str = in_l
306        out_str = in_dec
307        out_str = in_sng
308        out_str = in_dbl
309        out_str = in_dt
310#End If
311    End Sub
312End Class
313
314Class ArrayType1
315    Sub M()
316        Dim in_ia() As ia
317        Dim in_ic() As ic
318        Dim in_ca() As ca
319        Dim in_cb() As cb
320        Dim in_ia2(,) As ia
321        Dim in_ia_D7(7) As ia
322        Dim in_ia_R2()() As ia
323        Dim in_c_ia() As c_ia
324        Dim in_e_b() As e_b
325        Dim in_e_i() As e_i
326        Dim in_byte() As Byte
327        Dim in_integer() As Integer
328        Dim in_enum() As system.enum
329        Dim in_vt() As system.valuetype
330
331        Dim out_ia() As ia
332        Dim out_ic() As ic
333        Dim out_ca() As ca
334        Dim out_cb() As cb
335        Dim out_c_ia() As c_ia
336        Dim out_ia_D6(6) As ia
337        Dim out_e_b() As e_b
338        Dim out_e_i() As e_i
339        Dim out_byte() As Byte
340        Dim out_integer() As Integer
341        Dim out_enum() As system.enum
342        Dim out_vt() As system.valuetype
343        Dim out_obj() As Object
344        Dim out As system.array
345
346        out_ia = in_ia
347        out_ia = in_ic
348#If Not STRICT Then
349        out_ic = in_ia
350#End If
351
352        out_ia = in_c_ia
353        out_ca = in_cb
354
355        out_ia_D6 = in_ia_D7
356        out_e_b = in_e_b
357        out_byte = in_e_b
358        out_integer = in_e_i
359        out_enum = in_enum
360#If Not STRICT Then
361        out_e_i = in_integer
362#End If
363
364        out_obj = in_enum
365        out_obj = in_vt
366        out = in_enum
367        out = in_vt
368        out = in_integer
369        out = in_e_i
370    End Sub
371
372    Sub TG1(Of X As Structure)()
373        Dim in_a() As X
374        Dim in_b() As X
375        in_a = in_b
376    End Sub
377End Class
378
379Class ValueType1
380    Sub M()
381        Dim in_sa As sa
382        Dim in_sb As sb
383        Dim in_s_ic As s_ic
384        Dim in_ia As ia
385        Dim in_ic As ic
386        Dim in_id As id(Of Object)
387        Dim in_s_id As s_id(Of Object)
388        Dim in_s_id_byte As s_id(Of Byte)
389
390        Dim out_sa As sa
391        Dim out_sb As sb
392        Dim out_s_ic As s_ic
393        Dim out_ia As ia
394        Dim out_ic As ic
395        Dim out_vt As system.valuetype
396        Dim out As Object
397        Dim out_id As id(Of Object)
398        Dim out_id_str As id(Of String)
399
400        out_sa = in_sa
401        out_ia = in_s_ic
402        out_ic = in_s_ic
403        out_vt = in_sa
404        out_vt = in_s_ic
405        out = in_sa
406        out_id = in_s_id
407#If Not STRICT Then
408        out_s_ic = in_ic
409#End If
410    End Sub
411End Class
412
413Class String1
414    Sub M()
415        Dim c As Char
416        Dim s As String
417        Dim c_arr() As Char
418
419        s = c
420        s = c_arr
421#If Not STRICT Then
422        c = s
423        c_arr = s
424#End If
425    End Sub
426End Class
427
428Class Nullable1
429    Sub M()
430        Dim in_i_n As Integer?
431        Dim in_i As Integer
432        Dim in_s As Short
433        Dim in_s_n As Short?
434        Dim in_s_ic_n As s_ic?
435        Dim in_s_id_n As s_id(Of String)?
436
437        Dim out_i_n As Integer?
438        Dim out_i As Integer
439        Dim out_s_n As Short?
440        Dim out_s As Short
441        Dim out_ic As ic
442        Dim out_ib As ib
443        Dim out_id As id(Of String)
444
445        out_i_n = in_i
446        out_i_n = in_s
447        out_s_n = in_s_n
448        out_ic = in_s_ic_n
449        out_ib = in_s_ic_n
450        out_id = in_s_id_n
451
452#If Not STRICT Then
453        out_i = in_i_n
454        out_s_n = in_i_n
455        out_s_n = in_i
456        out_s = in_i_n
457#End If
458        out_ic = in_s_ic_n
459    End Sub
460End Class
461
462Class GenericType1A(Of C)
463    Shared Sub GenericMethodTypeArgument(Of M)(ByVal a As C, ByVal b As M)
464        Dim o As Object
465        Dim l As Long
466
467        o = a
468        o = b
469#If Not STRICT Then
470        a = o
471        b = o
472#End If
473        l = CLng(CObj(a))
474        l = CLng(CObj(b))
475    End Sub
476End Class
477Class GenericType1B(Of C As Structure)
478    Shared Sub GenericMethodTypeArgument(Of M As Structure)(ByVal a As C, ByVal b As M)
479        Dim o As Object
480
481        o = a
482        o = b
483#If Not STRICT Then
484        a = o
485        b = o
486#End If
487    End Sub
488End Class
489Class GenericType1C(Of C As Class)
490    Shared Sub GenericMethodTypeArgument(Of M As Class)(ByVal a As C, ByVal b As M)
491        Dim o As Object
492
493        o = a
494        o = b
495    End Sub
496End Class
497Class GenericType1D(Of C As New)
498    Shared Sub GenericMethodTypeArgument(Of M)(ByVal a As C, ByVal b As M)
499        Dim o As Object
500
501        o = a
502        o = b
503    End Sub
504End Class
505
506Class GenericType2A(Of C As IA)
507    Shared Sub GenericMethodTypeArgument(Of M As IA)(ByVal a As C, ByVal b As M)
508        Dim o As IA
509        Dim o2 As IB
510
511        o = a
512        o = b
513#If Not STRICT Then
514        a = o
515        b = o
516        a = o2
517        b = o2
518#End If
519    End Sub
520End Class
521
522Class GenericType2B(Of C As IC)
523    Shared Sub GenericMethodTypeArgument(Of M As IC)(ByVal a As C, ByVal b As M)
524        Dim o As IA
525        Dim o2 As IB
526        Dim o3 As IC
527
528        o = a
529        o = b
530#If Not STRICT Then
531        o2 = a
532        o2 = b
533        o3 = a
534        o3 = b
535#End If
536    End Sub
537End Class
538
539Class GenericType3A(Of C As C_IA)
540    Shared Sub GenericMethodTypeArgument(Of M As C_IA)(ByVal a As C, ByVal b As M)
541        Dim o As IA
542        Dim o2 As C_IA_D
543        o = a
544        o = b
545    End Sub
546End Class
547
548Class GenericType4A(Of C As C_IA)
549    Shared Sub GenericMethodTypeArgument(Of M As C_IA)(ByVal a As C, ByVal b As M)
550        Dim enumerableC As system.collections.generic.ienumerable(Of C)
551        Dim arrC() As M
552        Dim enumerableA As system.collections.generic.ienumerable(Of M)
553        Dim arrA() As M
554
555        enumerableC = arrC
556        enumerableA = arrA
557    End Sub
558End Class
559
560Interface IA
561
562End Interface
563Interface IB
564
565End Interface
566Interface IC
567    Inherits IA, IB
568End Interface
569Interface ID(Of T)
570
571End Interface
572
573Delegate Sub DA()
574
575Class CA
576End Class
577
578Class CB
579    Inherits CA
580End Class
581
582Class C_IA
583    Implements IA
584End Class
585Class C_IA_D
586    Inherits C_IA
587End Class
588Class C_IB
589    Implements IB
590End Class
591Class C_IC
592    Implements IC
593End Class
594
595Enum E_B As Byte
596    a
597End Enum
598Enum E_I As Integer
599    a
600End Enum
601
602Structure SA
603    Dim v As Integer
604End Structure
605Structure SB
606    Dim v As Integer
607End Structure
608Structure S_IC
609    Implements IC
610    Dim v As Integer
611End Structure
612Structure S_ID(Of T)
613    Implements ID(Of T)
614    Dim v As Integer
615End Structure
616