title: .NET 4.0 framework dynamic features in VB with Option Strict On?
body: <p>Is there any way to use the new dynamic features in the 4.0 framework like <code>ExpandoObject</code> in VB.NET without setting <code>Option Strict Off</code>?  With C#, you lose type safety <strong>only</strong> with the variables you specifically declare as <code>dynamic</code>. But with VB, the only way I've found to use these features is with the old <code>Option Strict Off</code> trick that's been in VB.NET since the beginning.  Without Option Strict, everything in the file is polluted with fuzzy typing like so:</p>
  
  <pre><code>Option Explicit On
  Option Strict Off
  Option Infer On
  
  Partial Public Class ClassX
  
     Public Sub TestDynamic()
        Dim dyn As Object = New System.Dynamic.ExpandoObject()
        Dim a As String = 1 ''# Ew!
        Dim obj As Object = "999"
  
        dyn.Str = a   ''# a is a string, remember?  Even though it has a number
        ''# dyn.Str = 1 : Type = System.String
        Console.WriteLine("dyn.Str = {0} : Type = {1}", dyn.Str, dyn.Str.GetType().ToString())
  
        dyn.Num = 123
        ''# dyn.Num = 123 : Type = System.Int32
        Console.WriteLine("dyn.Num = {0} : Type = {1}", dyn.Num, dyn.Num.GetType().ToString())
  
        dyn.Dbl = obj / 9
        ''# dyn.Dbl = 111 : Type = System.Double
        Console.WriteLine("dyn.Dbl = {0} : Type = {1}", dyn.Dbl, dyn.Dbl.GetType().ToString())
  
        dyn.Obj = obj
        ''# dyn.Obj = 999 : Type = System.String
        Console.WriteLine("dyn.Obj = {0} : Type = {1}", dyn.Obj, dyn.Obj.GetType().ToString())
  
        dyn.Dte = #5/5/1955#
        ''# dyn.Dte = 7/7/1977 12:00:00 AM : Type = System.DateTime
        Console.WriteLine("dyn.Dte = {0} : Type = {1}", dyn.Dte, dyn.Dte.GetType().ToString())
  
        AmICalled(dyn.Num)
        AmICalled(dyn.Obj)
        AmICalled(dyn.Str)
        AmICalled(dyn.Dbl)
  
        Try
           AmICalled(dyn.Dte)
        Catch
           Console.WriteLine("Dates don't convert to ints I guess... but we don't know that 'till runtime")
        End Try
  
        Console.WriteLine(dyn.Num + dyn.Str) ' 124!?
        Console.WriteLine(dyn.Num &amp; dyn.Str) ' 1231!?
  
     End Sub
  
     Private Sub AmICalled(ByVal i As Integer)
        Console.WriteLine("AmICalled was called with: " &amp; i)
     End Sub
  
  End Class
  </code></pre>
  
  <p>Is this really correct?  And, if so, what's the best way to still use things like <code>ExpandoObject</code> and mitigate the risk of losing all type safety?  Partial classes?  Or should I just not be so worried about type safety in this case?</p>