== Why is this an issue?

There are several compilations options available for Visual Basic source code and ``++Option Strict++`` defines compiler behavior for implicit data type conversions. Specifying ``++Option Strict Off++`` will allow:

* Implicit narrowing conversions
* Late binding
* Implicit typing that results in an ``++Object++`` type

This behavior can lead to unexpected runtime errors due to type mismatch or missing members. 


``++Option Strict++`` can be set in project properties or overridden in individual source files.


=== Noncompliant code example

[source,text]
----
Option Strict Off    ' Noncompliant

Public Class KnownType

    Public ReadOnly Property Name As String

End Class

Public Module MainMod

    Public Function DoSomething(Arg) As String  ' Type for "Arg" argument is not defined.
        Dim Item As KnownType = Arg             ' Implicit narrowing conversion doesn't enforce "Arg" to be of type "KnownType"
        Return Arg.Title                        ' "Title" might not exist in "Arg"
    End Function

End Module
----


=== Compliant solution

[source,text]
----
Option Strict On

Public Class KnownType

    Public ReadOnly Property Name As String

End Class

Public Module MainMod

    Public Function DoSomething(Arg As KnownType) As String
        Dim Item As KnownType = Arg
        Return Arg.Name
    End Function

End Module
----


== Resources

* https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/option-strict-statement[Visual Basic documentation - Option Strict Statement]

