File: Semantics\VarianceConversions.vb
Web Access
Project: src\src\Compilers\VisualBasic\Test\Semantic\Microsoft.CodeAnalysis.VisualBasic.Semantic.UnitTests.vbproj (Microsoft.CodeAnalysis.VisualBasic.Semantic.UnitTests)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
 
Imports System.IO
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.SpecialType
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.OverloadResolution
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.CodeAnalysis.VisualBasic.UnitTests.Emit
Imports Basic.Reference.Assemblies
Imports Roslyn.Test.Utilities
 
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics
 
    Public Class VarianceConversions
        Inherits BasicTestBase
 
        <Fact>
        Public Sub SimpleTest_In_1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Option Strict On
 
Imports System
 
Module Module1
 
    Interface I123(Of In T)
        Interface I124
            Sub M2(x As T)
        End Interface
 
        Sub M1(x As T)
    End Interface
 
    Class Base
    End Class
 
    Class Derived
        Inherits Base
    End Class
 
    Class B1
        Implements I123(Of Base), I123(Of Base).I124
 
 
        Public Sub M1(x As Base) Implements I123(Of Base).M1
            System.Console.WriteLine("B1.M1")
        End Sub
 
        Public Sub M2(x As Base) Implements I123(Of Base).I124.M2
            System.Console.WriteLine("B1.M2")
        End Sub
    End Class
 
    Structure S1
        Implements I123(Of Base), I123(Of Base).I124
 
        Public Sub M1(x As Base) Implements I123(Of Base).M1
            System.Console.WriteLine("S1.M1")
        End Sub
 
        Public Sub M2(x As Base) Implements I123(Of Base).I124.M2
            System.Console.WriteLine("S1.M2")
        End Sub
    End Structure
 
    Sub M3(Of T As I123(Of Base), S As I123(Of Base).I124)(x As T, y As S)
        Dim x1 As I123(Of Derived) = x
        Dim y1 As I123(Of Derived).I124 = y
 
        x1.M1(New Derived())
        y1.M2(New Derived())
    End Sub
 
    Sub M4(Of T As B1)(x As T)
        Dim x1 As I123(Of Derived) = x
        Dim y1 As I123(Of Derived).I124 = x
 
        x1.M1(New Derived())
        y1.M2(New Derived())
    End Sub
 
    MustInherit Class Base2(Of T)
        MustOverride Sub M5(Of S As T)(x As S)
 
    End Class
 
    Class Derived2
        Inherits Base2(Of S1)
 
        Public Overrides Sub M5(Of S As S1)(x As S)
            Dim x1 As I123(Of Derived) = x
            Dim y1 As I123(Of Derived).I124 = x
 
            x1.M1(New Derived())
            y1.M2(New Derived())
        End Sub
    End Class
 
    Sub Test(Of T As I123(Of Base), U As T, V As U)(x As V)
        System.Console.WriteLine("Test")
        Dim y As I123(Of Derived) = x
    End Sub
 
    Sub Main()
 
        Dim x As I123(Of Base) = New B1()
        Dim y As I123(Of Derived) = x
        y.M1(New Derived())
        y = New S1()
        y.M1(New Derived())
        y = New B1()
        y.M1(New Derived())
 
        Dim x1 As I123(Of Base).I124 = New B1()
        Dim y1 As I123(Of Derived).I124 = x1
        y1.M2(New Derived())
        y1 = New S1()
        y1.M2(New Derived())
        y1 = New B1()
        y1.M2(New Derived())
 
        M3(x, x1)
        M3(New S1(), New S1())
        M3(New B1(), New B1())
 
        M4(New B1())
 
        Dim z As New Derived2()
        z.M5(New S1())
 
        Test(Of B1, B1, B1)(New B1())
    End Sub
End Module
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
B1.M1
S1.M1
B1.M1
B1.M2
S1.M2
B1.M2
B1.M1
B1.M2
S1.M1
S1.M2
B1.M1
B1.M2
B1.M1
B1.M2
S1.M1
S1.M2
Test
]]>)
 
        End Sub
 
        <Fact>
        Public Sub SimpleTest_Out_1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Option Strict On
 
Imports System
 
Module Module1
 
    Interface I123(Of Out T)
        Interface I124
            Function M2() As T
        End Interface
 
        Function M1() As T
    End Interface
 
    Class Base
    End Class
 
    Class Derived
        Inherits Base
    End Class
 
    Class B1
        Implements I123(Of Derived), I123(Of Derived).I124
 
 
        Public Function M1() As Derived Implements I123(Of Derived).M1
            System.Console.WriteLine("B1.M1")
            Return New Derived()
        End Function
 
        Public Function M2() As Derived Implements I123(Of Derived).I124.M2
            System.Console.WriteLine("B1.M2")
            Return New Derived()
        End Function
    End Class
 
    Structure S1
        Implements I123(Of Derived), I123(Of Derived).I124
 
        Public Function M1() As Derived Implements I123(Of Derived).M1
            System.Console.WriteLine("S1.M1")
            Return New Derived()
        End Function
 
        Public Function M2() As Derived Implements I123(Of Derived).I124.M2
            System.Console.WriteLine("S1.M2")
            Return New Derived()
        End Function
    End Structure
 
    Sub M3(Of T As I123(Of Derived), S As I123(Of Derived).I124)(x As T, y As S)
        Dim x1 As I123(Of Base) = x
        Dim y1 As I123(Of Base).I124 = y
 
        Dim z As Base = x1.M1()
        z = y1.M2()
    End Sub
 
    Sub M4(Of T As B1)(x As T)
        Dim x1 As I123(Of Base) = x
        Dim y1 As I123(Of Base).I124 = x
 
        Dim z As Base = x1.M1()
        z = y1.M2()
    End Sub
 
    MustInherit Class Base2(Of T)
        MustOverride Sub M5(Of S As T)(x As S)
    End Class
 
    Class Derived2
        Inherits Base2(Of S1)
 
        Public Overrides Sub M5(Of S As S1)(x As S)
            Dim x1 As I123(Of Base) = x
            Dim y1 As I123(Of Base).I124 = x
 
            Dim z As Base = x1.M1()
            z = y1.M2()
        End Sub
    End Class
 
    Sub Main()
 
        Dim x As I123(Of Derived) = New B1()
        Dim y As I123(Of Base) = x
        Dim z As Base = y.M1()
        y = New S1()
        z = y.M1()
        y = New B1()
        z = y.M1()
 
        Dim x1 As I123(Of Derived).I124 = New B1()
        Dim y1 As I123(Of Base).I124 = x1
        z = y1.M2()
        y1 = New S1()
        z = y1.M2()
        y1 = New B1()
        z = y1.M2()
 
        M3(x, x1)
        M3(New S1(), New S1())
        M3(New B1(), New B1())
 
        M4(New B1())
 
        Dim u As New Derived2()
        u.M5(New S1())
    End Sub
End Module
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
B1.M1
S1.M1
B1.M1
B1.M2
S1.M2
B1.M2
B1.M1
B1.M2
S1.M1
S1.M2
B1.M1
B1.M2
B1.M1
B1.M2
S1.M1
S1.M2]]>)
 
        End Sub
 
        <Fact>
        Public Sub NoVarianceConversion1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Interface I123(Of In T, Out S)
    End Interface
 
    Class Base
    End Class
 
    Class Derived
        Inherits Base
    End Class
 
    Structure Unrelated
    End Structure
 
    Sub Main()
        Dim x1 As I123(Of Base, Base) = Nothing
        Dim x2 As I123(Of Base, Derived) = Nothing
        Dim x3 As I123(Of Derived, Base) = Nothing
        Dim x4 As I123(Of Derived, Derived) = Nothing
        Dim x5 As I123(Of Base, Unrelated) = Nothing
        Dim x6 As I123(Of Derived, Unrelated) = Nothing
        Dim x7 As I123(Of Unrelated, Derived) = Nothing
        Dim x8 As I123(Of Unrelated, Base) = Nothing
        Dim x9 As I123(Of Unrelated, Unrelated) = Nothing
 
        x1 = x2
        x1 = x3
        x1 = x4
        x1 = x5
        x1 = x6
        x1 = x7
        x1 = x8
        x1 = x9
 
        x2 = x1
        x2 = x3
        x2 = x4
        x2 = x5
        x2 = x6
        x2 = x7
        x2 = x8
        x2 = x9
 
        x3 = x1
        x3 = x2
        x3 = x4
        x3 = x5
        x3 = x6
        x3 = x7
        x3 = x8
        x3 = x9
 
        x4 = x1
        x4 = x2
        x4 = x3
        x4 = x5
        x4 = x6
        x4 = x7
        x4 = x8
        x4 = x9
 
        x5 = x1
        x5 = x2
        x5 = x3
        x5 = x4
        x5 = x6
        x5 = x7
        x5 = x8
        x5 = x9
 
        x6 = x1
        x6 = x2
        x6 = x3
        x6 = x4
        x6 = x5
        x6 = x7
        x6 = x8
        x6 = x9
 
        x7 = x1
        x7 = x2
        x7 = x3
        x7 = x4
        x7 = x5
        x7 = x6
        x7 = x8
        x7 = x9
 
        x8 = x1
        x8 = x2
        x8 = x3
        x8 = x4
        x8 = x5
        x8 = x6
        x8 = x7
        x8 = x9
 
        x9 = x1
        x9 = x2
        x9 = x3
        x9 = x4
        x9 = x5
        x9 = x6
        x9 = x7
        x9 = x8
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Base)' to 'Module1.I123(Of Module1.Base, Module1.Base)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x1 = x3
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Derived)' to 'Module1.I123(Of Module1.Base, Module1.Base)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x1 = x4
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Unrelated)' to 'Module1.I123(Of Module1.Base, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x1 = x5
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Unrelated)' to 'Module1.I123(Of Module1.Base, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x1 = x6
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Derived)' to 'Module1.I123(Of Module1.Base, Module1.Base)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x1 = x7
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Base)' to 'Module1.I123(Of Module1.Base, Module1.Base)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x1 = x8
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)' to 'Module1.I123(Of Module1.Base, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x1 = x9
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Base)' to 'Module1.I123(Of Module1.Base, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x2 = x1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Base)' to 'Module1.I123(Of Module1.Base, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x2 = x3
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Derived)' to 'Module1.I123(Of Module1.Base, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x2 = x4
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Unrelated)' to 'Module1.I123(Of Module1.Base, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x2 = x5
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Unrelated)' to 'Module1.I123(Of Module1.Base, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x2 = x6
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Derived)' to 'Module1.I123(Of Module1.Base, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x2 = x7
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Base)' to 'Module1.I123(Of Module1.Base, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x2 = x8
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)' to 'Module1.I123(Of Module1.Base, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x2 = x9
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Unrelated)' to 'Module1.I123(Of Module1.Derived, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x3 = x5
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Unrelated)' to 'Module1.I123(Of Module1.Derived, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x3 = x6
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Derived)' to 'Module1.I123(Of Module1.Derived, Module1.Base)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x3 = x7
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Base)' to 'Module1.I123(Of Module1.Derived, Module1.Base)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x3 = x8
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)' to 'Module1.I123(Of Module1.Derived, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x3 = x9
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Base)' to 'Module1.I123(Of Module1.Derived, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x4 = x1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Base)' to 'Module1.I123(Of Module1.Derived, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x4 = x3
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Unrelated)' to 'Module1.I123(Of Module1.Derived, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x4 = x5
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Unrelated)' to 'Module1.I123(Of Module1.Derived, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x4 = x6
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Derived)' to 'Module1.I123(Of Module1.Derived, Module1.Derived)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x4 = x7
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Base)' to 'Module1.I123(Of Module1.Derived, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x4 = x8
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)' to 'Module1.I123(Of Module1.Derived, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x4 = x9
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Base)' to 'Module1.I123(Of Module1.Base, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x5 = x1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Derived)' to 'Module1.I123(Of Module1.Base, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x5 = x2
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Base)' to 'Module1.I123(Of Module1.Base, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x5 = x3
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Derived)' to 'Module1.I123(Of Module1.Base, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x5 = x4
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Unrelated)' to 'Module1.I123(Of Module1.Base, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x5 = x6
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Derived)' to 'Module1.I123(Of Module1.Base, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x5 = x7
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Base)' to 'Module1.I123(Of Module1.Base, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x5 = x8
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)' to 'Module1.I123(Of Module1.Base, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x5 = x9
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Base)' to 'Module1.I123(Of Module1.Derived, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x6 = x1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Derived)' to 'Module1.I123(Of Module1.Derived, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x6 = x2
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Base)' to 'Module1.I123(Of Module1.Derived, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x6 = x3
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Derived)' to 'Module1.I123(Of Module1.Derived, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x6 = x4
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Derived)' to 'Module1.I123(Of Module1.Derived, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x6 = x7
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Base)' to 'Module1.I123(Of Module1.Derived, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x6 = x8
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)' to 'Module1.I123(Of Module1.Derived, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x6 = x9
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Base)' to 'Module1.I123(Of Module1.Unrelated, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x7 = x1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Derived)' to 'Module1.I123(Of Module1.Unrelated, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x7 = x2
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Base)' to 'Module1.I123(Of Module1.Unrelated, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x7 = x3
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Derived)' to 'Module1.I123(Of Module1.Unrelated, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x7 = x4
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Unrelated)' to 'Module1.I123(Of Module1.Unrelated, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x7 = x5
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Unrelated)' to 'Module1.I123(Of Module1.Unrelated, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x7 = x6
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Base)' to 'Module1.I123(Of Module1.Unrelated, Module1.Derived)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x7 = x8
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)' to 'Module1.I123(Of Module1.Unrelated, Module1.Derived)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x7 = x9
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Base)' to 'Module1.I123(Of Module1.Unrelated, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x8 = x1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Derived)' to 'Module1.I123(Of Module1.Unrelated, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x8 = x2
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Base)' to 'Module1.I123(Of Module1.Unrelated, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x8 = x3
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Derived)' to 'Module1.I123(Of Module1.Unrelated, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x8 = x4
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Unrelated)' to 'Module1.I123(Of Module1.Unrelated, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x8 = x5
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Unrelated)' to 'Module1.I123(Of Module1.Unrelated, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x8 = x6
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)' to 'Module1.I123(Of Module1.Unrelated, Module1.Base)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x8 = x9
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Base)' to 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x9 = x1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Derived)' to 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x9 = x2
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Base)' to 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x9 = x3
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Derived)' to 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x9 = x4
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base, Module1.Unrelated)' to 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Base', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x9 = x5
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived, Module1.Unrelated)' to 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)'; this conversion may fail because 'Module1.Unrelated' is not derived from 'Module1.Derived', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T, Out S)'.
        x9 = x6
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Derived)' to 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)'; this conversion may fail because 'Module1.Derived' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x9 = x7
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Unrelated, Module1.Base)' to 'Module1.I123(Of Module1.Unrelated, Module1.Unrelated)'; this conversion may fail because 'Module1.Base' is not derived from 'Module1.Unrelated', as required for the 'Out' generic parameter 'S' in 'Interface I123(Of In T, Out S)'.
        x9 = x8
             ~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub NoVarianceConversion2()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class Base
    End Class
 
    Class Derived
        Inherits Base
    End Class
 
    Class B1
        Implements I123(Of Base)
    End Class
 
    Structure S1
        Implements I123(Of Base)
    End Structure
 
    Structure S2
        Implements I123(Of Derived)
    End Structure
 
    Sub Main()
        Dim x1 As I123(Of Derived) = Nothing
        Dim y1 As I123(Of Base) = Nothing
        Dim z1 As S1
 
        z1 = x1
        z1 = y1
 
        Dim z2 As S2
 
        z2 = x1
        z2 = y1
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30311: Value of type 'Module1.I123(Of Module1.Derived)' cannot be converted to 'Module1.S1'.
        z1 = x1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Base)' to 'Module1.S1'.
        z1 = y1
             ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.Derived)' to 'Module1.S2'.
        z2 = x1
             ~~
BC30311: Value of type 'Module1.I123(Of Module1.Base)' cannot be converted to 'Module1.S2'.
        z2 = y1
             ~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub NoVarianceConversion3()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Interface I124(Of Out T)
    End Interface
 
    Class B1
    End Class
 
    Structure S1
    End Structure
 
    Sub Main()
        Dim i1 As I123(Of Object) = Nothing
        Dim x1 As I123(Of B1) = i1
        Dim i2 As I124(Of B1) = Nothing
        Dim x2 As I124(Of Object) = i2
 
        Dim i3 As I123(Of Object) = Nothing
        Dim x3 As I123(Of S1) = i3
        Dim i4 As I124(Of S1) = Nothing
        Dim x4 As I124(Of Object) = i4
    End Sub
 
    MustInherit Class Base(Of T, S)
        MustOverride Sub Goo(Of U As T, V As S)()
    End Class
 
    Class Derived
        Inherits Base(Of B1, S1)
 
        Public Overrides Sub Goo(Of U As B1, V As S1)()
            Dim i1 As I123(Of Object) = Nothing
            Dim x1 As I123(Of U) = i1
            Dim i2 As I124(Of U) = Nothing
            Dim x2 As I124(Of Object) = i2
 
            Dim i3 As I123(Of Object) = Nothing
            Dim x3 As I123(Of V) = i3
            Dim i4 As I124(Of V) = Nothing
            Dim x4 As I124(Of Object) = i4
        End Sub
    End Class
 
    Class Derived2
        Inherits Base(Of B1, S1?)
 
        Public Overrides Sub Goo(Of U2 As B1, V2 As S1?)()
            Dim i3 As I123(Of Object) = Nothing
            Dim x3 As I123(Of V2) = i3
            Dim i4 As I124(Of V2) = Nothing
            Dim x4 As I124(Of Object) = i4
        End Sub
    End Class
 
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'Module1.I123(Of Object)' to 'Module1.I123(Of Module1.S1)'; this conversion may fail because 'Module1.S1' is not derived from 'Object', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
        Dim x3 As I123(Of S1) = i3
                                ~~
BC42016: Implicit conversion from 'Module1.I124(Of Module1.S1)' to 'Module1.I124(Of Object)'; this conversion may fail because 'Module1.S1' is not derived from 'Object', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
        Dim x4 As I124(Of Object) = i4
                                    ~~
BC42016: Implicit conversion from 'Module1.I123(Of Object)' to 'Module1.I123(Of V As Module1.S1)'; this conversion may fail because 'V' is not derived from 'Object', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
            Dim x3 As I123(Of V) = i3
                                   ~~
BC42016: Implicit conversion from 'Module1.I124(Of V As Module1.S1)' to 'Module1.I124(Of Object)'; this conversion may fail because 'V' is not derived from 'Object', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
            Dim x4 As I124(Of Object) = i4
                                        ~~
BC42016: Implicit conversion from 'Module1.I123(Of Object)' to 'Module1.I123(Of V2 As Module1.S1?)'; this conversion may fail because 'V2' is not derived from 'Object', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
            Dim x3 As I123(Of V2) = i3
                                    ~~
BC42016: Implicit conversion from 'Module1.I124(Of V2 As Module1.S1?)' to 'Module1.I124(Of Object)'; this conversion may fail because 'V2' is not derived from 'Object', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
            Dim x4 As I124(Of Object) = i4
                                        ~~
</expected>)
 
            compilation = compilation.WithOptions(compilation.Options.WithOptionStrict(OptionStrict.On))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC36755: 'Module1.I123(Of Object)' cannot be converted to 'Module1.I123(Of Module1.S1)' because 'Module1.S1' is not derived from 'Object', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
        Dim x3 As I123(Of S1) = i3
                                ~~
BC36754: 'Module1.I124(Of Module1.S1)' cannot be converted to 'Module1.I124(Of Object)' because 'Module1.S1' is not derived from 'Object', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
        Dim x4 As I124(Of Object) = i4
                                    ~~
BC36755: 'Module1.I123(Of Object)' cannot be converted to 'Module1.I123(Of V As Module1.S1)' because 'V' is not derived from 'Object', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
            Dim x3 As I123(Of V) = i3
                                   ~~
BC36754: 'Module1.I124(Of V As Module1.S1)' cannot be converted to 'Module1.I124(Of Object)' because 'V' is not derived from 'Object', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
            Dim x4 As I124(Of Object) = i4
                                        ~~
BC36755: 'Module1.I123(Of Object)' cannot be converted to 'Module1.I123(Of V2 As Module1.S1?)' because 'V2' is not derived from 'Object', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
            Dim x3 As I123(Of V2) = i3
                                    ~~
BC36754: 'Module1.I124(Of V2 As Module1.S1?)' cannot be converted to 'Module1.I124(Of Object)' because 'V2' is not derived from 'Object', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
            Dim x4 As I124(Of Object) = i4
                                        ~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub NoVarianceConversion4()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb"><![CDATA[
Imports System
Imports System.Runtime.CompilerServices

Module Module1

    Interface I123(Of In T)
    End Interface

    Interface I124(Of Out T)
    End Interface

    Enum e1 As Integer
        a
    End Enum

    <extension()>
    Sub Goo1(i As I123(Of e1()))
    End Sub

    <extension()>
    Sub Goo2(i As I123(Of Integer()))
    End Sub

    Sub Goo3(i As I124(Of e1()))
    End Sub

    <extension()>
    Sub Goo4(i As I124(Of Integer()))
    End Sub

    Structure S1(Of T)
        Implements I123(Of T), I124(Of T)
    End Structure

    Sub Main()
        Dim i1 As I123(Of e1()) = Nothing
        Dim i2 As I123(Of Integer()) = i1
        i1 = i2

        Dim i3 As I124(Of e1()) = Nothing
        Dim i4 As I124(Of Integer()) = i3
        i3 = i4

        i2.Goo1()
        i1.Goo2()

        i4.Goo3()
        i3.Goo4()

        i1.Goo1()
        i2.Goo2()

        i3.Goo3()
        i4.Goo4()

        Dim s1 As New S1(Of e1())
        Dim s2 As New S1(Of Integer())

        s1.Goo1()
        s1.Goo2()
        s1.Goo3()
        s1.Goo4()

        s2.Goo1()
        s2.Goo2()
        s2.Goo3()
        s2.Goo4()
    End Sub
End Module
    ]]></file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(compilationDef,
                                                                                     {Net40.References.SystemCore},
                                                                                     TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'Module1.I123(Of Module1.e1())' to 'Module1.I123(Of Integer())'; this conversion may fail because 'Integer()' is not derived from 'Module1.e1()', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
        Dim i2 As I123(Of Integer()) = i1
                                       ~~
BC42016: Implicit conversion from 'Module1.I124(Of Integer())' to 'Module1.I124(Of Module1.e1())'; this conversion may fail because 'Integer()' is not derived from 'Module1.e1()', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
        i3 = i4
             ~~
BC30456: 'Goo1' is not a member of 'Module1.I123(Of Integer())'.
        i2.Goo1()
        ~~~~~~~
BC30456: 'Goo2' is not a member of 'Module1.I123(Of Module1.e1())'.
        i1.Goo2()
        ~~~~~~~
BC30456: 'Goo3' is not a member of 'Module1.I124(Of Integer())'.
        i4.Goo3()
        ~~~~~~~
BC30456: 'Goo4' is not a member of 'Module1.I124(Of Module1.e1())'.
        i3.Goo4()
        ~~~~~~~
BC30456: 'Goo3' is not a member of 'Module1.I124(Of Module1.e1())'.
        i3.Goo3()
        ~~~~~~~
BC30456: 'Goo2' is not a member of 'Module1.S1(Of Module1.e1())'.
        s1.Goo2()
        ~~~~~~~
BC30456: 'Goo3' is not a member of 'Module1.S1(Of Module1.e1())'.
        s1.Goo3()
        ~~~~~~~
BC30456: 'Goo4' is not a member of 'Module1.S1(Of Module1.e1())'.
        s1.Goo4()
        ~~~~~~~
BC30456: 'Goo1' is not a member of 'Module1.S1(Of Integer())'.
        s2.Goo1()
        ~~~~~~~
BC30456: 'Goo3' is not a member of 'Module1.S1(Of Integer())'.
        s2.Goo3()
        ~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub VarianceConversionAmbiguity1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Class B3
        Inherits B2
    End Class
 
    Class B4
        Implements I123(Of B1), I123(Of B3)
    End Class
 
    Class B5
        Implements I123(Of B3), I123(Of B1)
    End Class
 
    Class B6
        Implements I123(Of B2), I123(Of B3), I123(Of B1)
    End Class
 
    Class B7
        Implements I123(Of B3), I123(Of B2), I123(Of B1)
    End Class
 
    Class B8
        Implements I123(Of B3), I123(Of B1), I123(Of B2)
    End Class
 
    Class B9
        Implements I123(Of B1), I123(Of B2)
    End Class
 
    Class B10
        Implements I123(Of B2), I123(Of B3)
    End Class
 
    Sub Main()
        Dim x1 As I123(Of B2) = New B4()
        Dim x2 As I123(Of B2) = New B5()
        Dim x3 As I123(Of B2) = New B6()
        Dim x4 As I123(Of B2) = New B7()
        Dim x5 As I123(Of B2) = New B8()
        Dim x6 As I123(Of B3) = New B9()
        Dim x7 As I123(Of B1) = New B10()
    End Sub
 
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42333: Interface 'Module1.I123(Of Module1.B3)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B1)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B1), I123(Of B3)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B3)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B2)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B2), I123(Of B3), I123(Of B1)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B2)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B2), I123(Of B3), I123(Of B1)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B2), I123(Of B3), I123(Of B1)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B2)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B2), I123(Of B1)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B2)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B2), I123(Of B1)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B2), I123(Of B1)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B2)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B2)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B1)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B2)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B2)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B2)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B2)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B1)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B1), I123(Of B2)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B3)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B2)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B2), I123(Of B3)
                                ~~~~~~~~~~~
BC42016: Conversion from 'Module1.B4' to 'Module1.I123(Of Module1.B2)' may be ambiguous.
        Dim x1 As I123(Of B2) = New B4()
                                ~~~~~~~~
BC42016: Conversion from 'Module1.B5' to 'Module1.I123(Of Module1.B2)' may be ambiguous.
        Dim x2 As I123(Of B2) = New B5()
                                ~~~~~~~~
BC42016: Conversion from 'Module1.B9' to 'Module1.I123(Of Module1.B3)' may be ambiguous.
        Dim x6 As I123(Of B3) = New B9()
                                ~~~~~~~~
BC42016: Conversion from 'Module1.B10' to 'Module1.I123(Of Module1.B1)' may be ambiguous.
        Dim x7 As I123(Of B1) = New B10()
                                ~~~~~~~~~
</expected>)
 
            compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42333: Interface 'Module1.I123(Of Module1.B3)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B1)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B1), I123(Of B3)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B3)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B2)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B2), I123(Of B3), I123(Of B1)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B2)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B2), I123(Of B3), I123(Of B1)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B2), I123(Of B3), I123(Of B1)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B2)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B2), I123(Of B1)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B2)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B2), I123(Of B1)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B2), I123(Of B1)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B2)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B2)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B1)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B2)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B2)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B2)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B2)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B1)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B1), I123(Of B2)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B3)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B2)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B2), I123(Of B3)
                                ~~~~~~~~~~~
BC36737: Option Strict On does not allow implicit conversions from 'Module1.B4' to 'Module1.I123(Of Module1.B2)' because the conversion is ambiguous.
        Dim x1 As I123(Of B2) = New B4()
                                ~~~~~~~~
BC36737: Option Strict On does not allow implicit conversions from 'Module1.B5' to 'Module1.I123(Of Module1.B2)' because the conversion is ambiguous.
        Dim x2 As I123(Of B2) = New B5()
                                ~~~~~~~~
BC36737: Option Strict On does not allow implicit conversions from 'Module1.B9' to 'Module1.I123(Of Module1.B3)' because the conversion is ambiguous.
        Dim x6 As I123(Of B3) = New B9()
                                ~~~~~~~~
BC36737: Option Strict On does not allow implicit conversions from 'Module1.B10' to 'Module1.I123(Of Module1.B1)' because the conversion is ambiguous.
        Dim x7 As I123(Of B1) = New B10()
                                ~~~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub VarianceConversionAmbiguity2()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Class B3
        Inherits B2
    End Class
 
    Class B4
        Inherits B3
    End Class
 
    Class B5
        Implements I123(Of B3), I123(Of B1), I123(Of B4)
    End Class
 
    Interface I1
        Inherits I123(Of B1)
    End Interface
 
    Interface I2
        Inherits I123(Of B1)
    End Interface
 
    Sub Goo(Of T As {I1, I2})(x As T)
        Dim x22 As I123(Of B2) = x
    End Sub
 
    Sub Goo(Of T As I123(Of B1), S As {T, I123(Of B3)})(x As S)
        Dim x33 As I123(Of B2) = x
    End Sub
 
    Sub Main()
        Dim x2 As I123(Of B2) = New B5()
    End Sub
 
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B4)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B4)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B1)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B4)
                                             ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B4)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1), I123(Of B4)
                                             ~~~~~~~~~~~
BC42016: Conversion from 'S' to 'Module1.I123(Of Module1.B2)' may be ambiguous.
        Dim x33 As I123(Of B2) = x
                                 ~
BC42016: Conversion from 'Module1.B5' to 'Module1.I123(Of Module1.B2)' may be ambiguous.
        Dim x2 As I123(Of B2) = New B5()
                                ~~~~~~~~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub VarianceConversionAmbiguity3()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Class B3
        Inherits B2
    End Class
 
    Class B4
        Implements I123(Of B3), I123(Of B1)
    End Class
 
    Interface I1(Of Out T)
    End Interface
 
    Interface I2(Of Out T, Out S)
    End Interface
 
    Structure S1
        Implements I123(Of B3), I123(Of B1)
    End Structure
 
    Sub Main()
        Dim x1 As I1(Of B4) = Nothing
        Dim x2 As I1(Of I123(Of B2)) = x1
 
        Dim x3 As B4 = Nothing
        Dim x4 As I123(Of B2) = x3
 
        Dim x5 As I2(Of B4, I123(Of B3)) = Nothing
        Dim x6 As I2(Of I123(Of B2), I123(Of B2)) = x5
 
        Dim x7 As I2(Of I123(Of B3), B4) = Nothing
        Dim x8 As I2(Of I123(Of B2), I123(Of B2)) = x7
 
        Dim y1 As B4() = Nothing
        Dim y2 As I123(Of B2)() = y1
        y1 = y2
 
        Dim y3 As I1(Of B4()) = Nothing
        Dim y4 As I1(Of I123(Of B2)()) = y3
 
        Dim y5 As I1(Of B4)() = Nothing
        Dim y6 As I1(Of I123(Of B2))() = y5
 
        Dim y7 As I123(Of B1)() = Nothing
        Dim y8 As System.Collections.Generic.IEnumerable(Of I123(Of B2)) = y7
 
        Dim y71 As B4() = Nothing
        Dim y81 As System.Collections.Generic.IEnumerable(Of I123(Of B2)) = y71
 
        Dim z1 As S1 = Nothing
        Dim z2 As I123(Of B2) = z1
 
    End Sub
 
    Sub Goo(Of T As {I123(Of B3), I123(Of B1)})(x As T)
        Dim p1 As I123(Of B2) = x
    End Sub
 
    Sub Goo(Of T As {I123(Of B3), I123(Of B1)})(x As T())
        Dim p2 As I123(Of B2)() = x
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1)
                                ~~~~~~~~~~~
BC42333: Interface 'Module1.I123(Of Module1.B1)' is ambiguous with another implemented interface 'Module1.I123(Of Module1.B3)' due to the 'In' and 'Out' parameters in 'Interface I123(Of In T)'.
        Implements I123(Of B3), I123(Of B1)
                                ~~~~~~~~~~~
BC42016: Conversion from 'Module1.I1(Of Module1.B4)' to 'Module1.I1(Of Module1.I123(Of Module1.B2))' may be ambiguous.
        Dim x2 As I1(Of I123(Of B2)) = x1
                                       ~~
BC42016: Conversion from 'Module1.B4' to 'Module1.I123(Of Module1.B2)' may be ambiguous.
        Dim x4 As I123(Of B2) = x3
                                ~~
BC42016: Implicit conversion from 'Module1.I2(Of Module1.B4, Module1.I123(Of Module1.B3))' to 'Module1.I2(Of Module1.I123(Of Module1.B2), Module1.I123(Of Module1.B2))'; this conversion may fail because 'Module1.I123(Of Module1.B3)' is not derived from 'Module1.I123(Of Module1.B2)', as required for the 'Out' generic parameter 'S' in 'Interface I2(Of Out T, Out S)'.
        Dim x6 As I2(Of I123(Of B2), I123(Of B2)) = x5
                                                    ~~
BC42016: Implicit conversion from 'Module1.I2(Of Module1.I123(Of Module1.B3), Module1.B4)' to 'Module1.I2(Of Module1.I123(Of Module1.B2), Module1.I123(Of Module1.B2))'; this conversion may fail because 'Module1.I123(Of Module1.B3)' is not derived from 'Module1.I123(Of Module1.B2)', as required for the 'Out' generic parameter 'T' in 'Interface I2(Of Out T, Out S)'.
        Dim x8 As I2(Of I123(Of B2), I123(Of B2)) = x7
                                                    ~~
BC42016: Conversion from 'Module1.B4()' to 'Module1.I123(Of Module1.B2)()' may be ambiguous.
        Dim y2 As I123(Of B2)() = y1
                                  ~~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.B2)()' to 'Module1.B4()'.
        y1 = y2
             ~~
BC42016: Conversion from 'Module1.I1(Of Module1.B4())' to 'Module1.I1(Of Module1.I123(Of Module1.B2)())' may be ambiguous.
        Dim y4 As I1(Of I123(Of B2)()) = y3
                                         ~~
BC42016: Conversion from 'Module1.I1(Of Module1.B4)()' to 'Module1.I1(Of Module1.I123(Of Module1.B2))()' may be ambiguous.
        Dim y6 As I1(Of I123(Of B2))() = y5
                                         ~~
BC42016: Conversion from 'Module1.B4()' to 'IEnumerable(Of Module1.I123(Of Module1.B2))' may be ambiguous.
        Dim y81 As System.Collections.Generic.IEnumerable(Of I123(Of B2)) = y71
                                                                            ~~~
BC42016: Conversion from 'Module1.S1' to 'Module1.I123(Of Module1.B2)' may be ambiguous.
        Dim z2 As I123(Of B2) = z1
                                ~~
BC42016: Conversion from 'T' to 'Module1.I123(Of Module1.B2)' may be ambiguous.
        Dim p1 As I123(Of B2) = x
                                ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of Module1.B2)()' may be ambiguous.
        Dim p2 As I123(Of B2)() = x
                                  ~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Interface I124(Of Out T)
    End Interface
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Sub Goo1(Of T As {I123(Of B1), I123(Of S)}, S As Class, Q As {Class, I123(Of B1)})(x As T, y As S, z As I123(Of S), u As Q)
        Dim b2 As B2 = y
        y = b2
        Dim p1 As I123(Of B2) = x
        p1 = z
        p1 = u
 
        Dim a1 As T() = Nothing
        Dim a2 As Q() = Nothing
        Dim a3 As I123(Of B2)() = a1
        a3 = a2
    End Sub
 
    Sub Goo2(Of T As {I124(Of B2), I124(Of S)}, S As Class, Q As {Class, I124(Of B2)})(x As T, y As S, z As I124(Of S), u As Q)
        Dim b1 As B1 = y
        y = b1
        Dim p1 As I124(Of B1) = x
        p1 = z
        p1 = u
 
        Dim a1 As T() = Nothing
        Dim a2 As Q() = Nothing
        Dim a3 As I124(Of B1)() = a1
        a3 = a2
    End Sub
 
    Sub Goo3(Of T As {I123(Of B1()), I123(Of S())}, S As Class, Q As {Class, I123(Of B1())})(x As T, y As S(), z As I123(Of S()), u As Q)
        Dim b2 As B2() = y
        y = b2
        Dim p1 As I123(Of B2()) = x
        p1 = z
        p1 = u
 
        Dim a1 As T() = Nothing
        Dim a2 As Q() = Nothing
        Dim a3 As I123(Of B2())() = a1
        a3 = a2
    End Sub
 
    Sub Goo4(Of T As {I124(Of B2()), I124(Of S())}, S As Class, Q As {Class, I124(Of B2())})(x As T, y As S(), z As I124(Of S()), u As Q)
        Dim b1 As B1() = y
        y = b1
        Dim p1 As I124(Of B1()) = x
        p1 = z
        p1 = u
 
        Dim a1 As T() = Nothing
        Dim a2 As Q() = Nothing
        Dim a3 As I124(Of B1())() = a1
        a3 = a2
    End Sub
 
    Sub Goo5(Of T As {I123(Of IEnumerable(Of B1)), I123(Of IEnumerable(Of S))},
                S As Class,
                Q As {Class, I123(Of IEnumerable(Of B1))})(x As T, y As IEnumerable(Of S), z As I123(Of IEnumerable(Of S)), u As Q)
        Dim b2 As B2() = y
        y = b2
        Dim p1 As I123(Of B2()) = x
        p1 = z
        p1 = u
 
        Dim a1 As T() = Nothing
        Dim a2 As Q() = Nothing
        Dim a3 As I123(Of B2())() = a1
        a3 = a2
    End Sub
 
    MustInherit Class B3(Of U)
        MustOverride Sub Goo6(Of T As {I123(Of Q()), I123(Of S())}, S As Structure, Q As U, R As Q)()
    End Class
 
    Structure S1
    End Structure
 
    Class B4
        Inherits B3(Of S1)
 
        Public Overrides Sub Goo6(Of T As {I123(Of Q()), I123(Of S())}, S As Structure, Q As S1, R As Q)()
            Dim a As R() = Nothing
            Dim b As Q() = a
 
            Dim x As T = Nothing
            Dim z As I123(Of R()) = x
 
            Dim x1 As T() = Nothing
            Dim z1 As I123(Of R())() = x1
        End Sub
    End Class
 
    Sub Main()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30311: Value of type 'S' cannot be converted to 'Module1.B2'.
        Dim b2 As B2 = y
                       ~
BC30311: Value of type 'Module1.B2' cannot be converted to 'S'.
        y = b2
            ~~
BC42016: Conversion from 'T' to 'Module1.I123(Of Module1.B2)' may be ambiguous.
        Dim p1 As I123(Of B2) = x
                                ~
BC42016: Implicit conversion from 'Module1.I123(Of S As Class)' to 'Module1.I123(Of Module1.B2)'; this conversion may fail because 'Module1.B2' is not derived from 'S', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
        p1 = z
             ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of Module1.B2)()' may be ambiguous.
        Dim a3 As I123(Of B2)() = a1
                                  ~~
BC30311: Value of type 'S' cannot be converted to 'Module1.B1'.
        Dim b1 As B1 = y
                       ~
BC30311: Value of type 'Module1.B1' cannot be converted to 'S'.
        y = b1
            ~~
BC42016: Conversion from 'T' to 'Module1.I124(Of Module1.B1)' may be ambiguous.
        Dim p1 As I124(Of B1) = x
                                ~
BC42016: Implicit conversion from 'Module1.I124(Of S As Class)' to 'Module1.I124(Of Module1.B1)'; this conversion may fail because 'S' is not derived from 'Module1.B1', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
        p1 = z
             ~
BC42016: Conversion from 'T()' to 'Module1.I124(Of Module1.B1)()' may be ambiguous.
        Dim a3 As I124(Of B1)() = a1
                                  ~~
BC30332: Value of type 'S()' cannot be converted to 'Module1.B2()' because 'S' is not derived from 'Module1.B2'.
        Dim b2 As B2() = y
                         ~
BC30332: Value of type 'Module1.B2()' cannot be converted to 'S()' because 'Module1.B2' is not derived from 'S'.
        y = b2
            ~~
BC42016: Conversion from 'T' to 'Module1.I123(Of Module1.B2())' may be ambiguous.
        Dim p1 As I123(Of B2()) = x
                                  ~
BC42016: Implicit conversion from 'Module1.I123(Of S())' to 'Module1.I123(Of Module1.B2())'; this conversion may fail because 'Module1.B2()' is not derived from 'S()', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
        p1 = z
             ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of Module1.B2())()' may be ambiguous.
        Dim a3 As I123(Of B2())() = a1
                                    ~~
BC30332: Value of type 'S()' cannot be converted to 'Module1.B1()' because 'S' is not derived from 'Module1.B1'.
        Dim b1 As B1() = y
                         ~
BC30332: Value of type 'Module1.B1()' cannot be converted to 'S()' because 'Module1.B1' is not derived from 'S'.
        y = b1
            ~~
BC42016: Conversion from 'T' to 'Module1.I124(Of Module1.B1())' may be ambiguous.
        Dim p1 As I124(Of B1()) = x
                                  ~
BC42016: Implicit conversion from 'Module1.I124(Of S())' to 'Module1.I124(Of Module1.B1())'; this conversion may fail because 'S()' is not derived from 'Module1.B1()', as required for the 'Out' generic parameter 'T' in 'Interface I124(Of Out T)'.
        p1 = z
             ~
BC42016: Conversion from 'T()' to 'Module1.I124(Of Module1.B1())()' may be ambiguous.
        Dim a3 As I124(Of B1())() = a1
                                    ~~
BC42016: Implicit conversion from 'IEnumerable(Of S As Class)' to 'Module1.B2()'.
        Dim b2 As B2() = y
                         ~
BC42016: Implicit conversion from 'Module1.B2()' to 'IEnumerable(Of S As Class)'; this conversion may fail because 'Module1.B2' is not derived from 'S', as required for the 'Out' generic parameter 'T' in 'Interface IEnumerable(Of Out T)'.
        y = b2
            ~~
BC42016: Conversion from 'T' to 'Module1.I123(Of Module1.B2())' may be ambiguous.
        Dim p1 As I123(Of B2()) = x
                                  ~
BC42016: Implicit conversion from 'Module1.I123(Of IEnumerable(Of S))' to 'Module1.I123(Of Module1.B2())'; this conversion may fail because 'Module1.B2()' is not derived from 'IEnumerable(Of S As Class)', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
        p1 = z
             ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of Module1.B2())()' may be ambiguous.
        Dim a3 As I123(Of B2())() = a1
                                    ~~
BC42016: Conversion from 'T' to 'Module1.I123(Of R())' may be ambiguous.
            Dim z As I123(Of R()) = x
                                    ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of R())()' may be ambiguous.
            Dim z1 As I123(Of R())() = x1
                                       ~~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions2()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Public Sub Goo7(Of T As {I123(Of Q()), I123(Of S())}, S As Structure, Q, R As Q)()
        Dim a As R() = Nothing
        Dim b As Q() = a
 
        Dim x As T = Nothing
        Dim z As I123(Of R()) = x
 
        Dim x1 As T() = Nothing
        Dim z1 As I123(Of R())() = x1
    End Sub
 
    Sub Main()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'R()' to 'Q()'.
        Dim b As Q() = a
                       ~
BC42016: Conversion from 'T' to 'Module1.I123(Of R())' may be ambiguous.
        Dim z As I123(Of R()) = x
                                ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of R())()' may be ambiguous.
        Dim z1 As I123(Of R())() = x1
                                   ~~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions3()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Public Sub Goo8(Of T As {I123(Of Q()), I123(Of S())}, S As Structure, Q, R As {Class, Q})()
        Dim a As R() = Nothing
        Dim b As Q() = a
 
        Dim x As T = Nothing
        Dim z As I123(Of R()) = x
 
        Dim x1 As T() = Nothing
        Dim z1 As I123(Of R())() = x1
    End Sub
 
    Sub Main()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'T()' to 'Module1.I123(Of R())()'.
        Dim z1 As I123(Of R())() = x1
                                   ~~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions4()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Public Sub Goo9(Of T As {I123(Of Q()), I123(Of S())}, S, Q, R As {Structure, Q})()
        Dim a As R() = Nothing
        Dim b As Q() = a
 
        Dim x As T = Nothing
        Dim z As I123(Of R()) = x
 
        Dim x1 As T() = Nothing
        Dim z1 As I123(Of R())() = x1
    End Sub
 
    Sub Main()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'R()' to 'Q()'.
        Dim b As Q() = a
                       ~
BC42016: Conversion from 'T' to 'Module1.I123(Of R())' may be ambiguous.
        Dim z As I123(Of R()) = x
                                ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of R())()' may be ambiguous.
        Dim z1 As I123(Of R())() = x1
                                   ~~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions5()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B5
        Implements I123(Of IEnumerable(Of Integer)), I123(Of UInteger())
    End Class
 
    Class B6
        Implements I123(Of IEnumerable(Of Integer)), 
                   I123(Of Byte()),
                   I123(Of SByte()),
                   I123(Of Boolean()),
                   I123(Of Int64()),
                   I123(Of UInt64())
    End Class
 
    Public Sub Main()
        Dim a As Integer() = Nothing
        Dim b As IEnumerable(Of Integer) = a
 
        Dim c As B5 = Nothing
        Dim d1 As I123(Of Integer()) = c
        Dim d2 As I123(Of TypeCode()) = c
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Conversion from 'Module1.B5' to 'Module1.I123(Of Integer())' may be ambiguous.
        Dim d1 As I123(Of Integer()) = c
                                       ~
BC42016: Conversion from 'Module1.B5' to 'Module1.I123(Of TypeCode())' may be ambiguous.
        Dim d2 As I123(Of TypeCode()) = c
                                        ~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions6()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B5
        Implements I123(Of IEnumerable(Of Int64)), I123(Of UInt64())
    End Class
 
    Class B6
        Implements I123(Of IEnumerable(Of Int64)), 
                   I123(Of Byte()), 
                   I123(Of SByte()), 
                   I123(Of Boolean()), 
                   I123(Of Int32()), 
                   I123(Of UInt32())
    End Class
 
    Sub Main()
        Dim a As Integer() = Nothing
        Dim b As IEnumerable(Of Integer) = a
 
        Dim c As B5 = Nothing
        Dim d1 As I123(Of Int64()) = c
 
        Dim c2 As B6 = Nothing
        Dim d3 As I123(Of Int64()) = c2
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Conversion from 'Module1.B5' to 'Module1.I123(Of Long())' may be ambiguous.
        Dim d1 As I123(Of Int64()) = c
                                     ~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions7()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B5
        Implements I123(Of IEnumerable(Of SByte)), I123(Of Byte())
    End Class
 
    Class B6
        Implements I123(Of IEnumerable(Of SByte)), 
                   I123(Of UInt64()), 
                   I123(Of Int64()), 
                   I123(Of Int32()), 
                   I123(Of UInt32())
    End Class
 
    Sub Main()
        Dim a As Integer() = Nothing
        Dim b As IEnumerable(Of Integer) = a
 
        Dim c As B5 = Nothing
        Dim d1 As I123(Of SByte()) = c
 
        Dim c2 As B6 = Nothing
        Dim d3 As I123(Of SByte()) = c2
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Conversion from 'Module1.B5' to 'Module1.I123(Of SByte())' may be ambiguous.
        Dim d1 As I123(Of SByte()) = c
                                     ~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions8()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B5
        Implements I123(Of IEnumerable(Of Boolean)), I123(Of SByte())
    End Class
 
    Class B6
        Implements I123(Of IEnumerable(Of Boolean)), 
                   I123(Of UInt64()), 
                   I123(Of Int64()), 
                   I123(Of Int32()), 
                   I123(Of UInt32())
    End Class
 
    Sub Main()
        Dim a As Integer() = Nothing
        Dim b As IEnumerable(Of Integer) = a
 
        Dim c As B5 = Nothing
        Dim d1 As I123(Of Boolean()) = c
 
        Dim c2 As B6 = Nothing
        Dim d3 As I123(Of Boolean()) = c2
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Conversion from 'Module1.B5' to 'Module1.I123(Of Boolean())' may be ambiguous.
        Dim d1 As I123(Of Boolean()) = c
                                       ~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions9()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B5(Of T)
 
        Class B6
            Implements I123(Of IEnumerable(Of Integer)), I123(Of T())
        End Class
 
        Sub Goo1()
            Dim x As B6 = Nothing
            Dim y As I123(Of Integer()) = x
        End Sub
    End Class
 
    Sub Main()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Conversion from 'Module1.B5(Of T).B6' to 'Module1.I123(Of Integer())' may be ambiguous.
            Dim y As I123(Of Integer()) = x
                                          ~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions10()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Interface I123(Of In T)
    End Interface
 
    Class B5(Of T)
 
        Class B6
            Implements I123(Of Integer()), I123(Of IEnumerable(Of T))
        End Class
 
        Sub Goo1()
            Dim x As B6 = Nothing
            Dim y As I123(Of T()) = x
        End Sub
    End Class
 
    Sub Main()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Conversion from 'Module1.B5(Of T).B6' to 'Module1.I123(Of T())' may be ambiguous.
            Dim y As I123(Of T()) = x
                                    ~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub Delegate1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Delegate Function D(Of In T, Out S)(x As T) As S
 
    Sub Main()
        Dim x As D(Of B1, B2) = Function(p As B1) As B2
                                    System.Console.WriteLine("Function(p As B1) As B2 - {0}", p)
                                    Return New B2()
                                End Function
        Dim y As D(Of B2, B1) = x
        y(New B2())
 
        x = Nothing
        x = y
        x(New B1())
    End Sub
End Module
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef, options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom),
                             expectedOutput:=
            <![CDATA[
Function(p As B1) As B2 - Module1+B2
Function(p As B1) As B2 - Module1+B1
]]>)
 
            CompilationUtils.AssertTheseDiagnostics(verifier.Compilation,
<expected>
BC42016: Implicit conversion from 'Module1.D(Of Module1.B2, Module1.B1)' to 'Module1.D(Of Module1.B1, Module1.B2)'; this conversion may fail because 'Module1.B1' is not derived from 'Module1.B2', as required for the 'Out' generic parameter 'S' in 'Delegate Function Module1.D(Of In T, Out S)(x As T) As S'.
        x = y
            ~
</expected>)
        End Sub
 
        <Fact>
        Public Sub Dev10_820752()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module2
    Class A
    End Class
    Class B
        Inherits A
    End Class
    Class C
        Inherits A
    End Class
    Public Sub Goo(ByVal a1 As A)
    End Sub
    Public Sub goo(ByVal a1 As Action(Of C))
        Console.WriteLine(TypeOf a1 Is 
        Action(Of B))
    End Sub
    Sub Main()
        Goo(New Action(Of A)(AddressOf Goo))
    End Sub
End Module
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef, options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom),
                             expectedOutput:=
            <![CDATA[
True
]]>)
 
            CompilationUtils.AssertTheseDiagnostics(verifier.Compilation,
<expected>
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub Delegate2()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Class B1
    End Class
 
    Class B2
    End Class
 
    Delegate Sub D(Of In T)()
    Delegate Sub D(Of In T, In S)()
 
 
    Sub Main()
        Dim x As D(Of B1) = Nothing
        Dim y As D(Of B2) = x
 
        Dim x1 As D(Of B1, Integer) = Nothing
        Dim y1 As D(Of B2, System.IComparable) = x1
        x1 = y1
 
        Dim x2 As D(Of Integer, B1) = Nothing
        Dim y2 As D(Of System.IComparable, B2) = x2
        x2 = y2
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'Module1.D(Of Module1.B1)' to 'Module1.D(Of Module1.B2)'; this conversion may fail because 'Module1.B2' is not derived from 'Module1.B1', as required for the 'In' generic parameter 'T' in 'Delegate Sub Module1.D(Of In T)()'.
        Dim y As D(Of B2) = x
                            ~
BC36755: 'Module1.D(Of Module1.B1, Integer)' cannot be converted to 'Module1.D(Of Module1.B2, IComparable)' because 'IComparable' is not derived from 'Integer', as required for the 'In' generic parameter 'S' in 'Delegate Sub Module1.D(Of In T, In S)()'.
        Dim y1 As D(Of B2, System.IComparable) = x1
                                                 ~~
BC36755: 'Module1.D(Of Module1.B2, IComparable)' cannot be converted to 'Module1.D(Of Module1.B1, Integer)' because 'Integer' is not derived from 'IComparable', as required for the 'In' generic parameter 'S' in 'Delegate Sub Module1.D(Of In T, In S)()'.
        x1 = y1
             ~~
BC36755: 'Module1.D(Of Integer, Module1.B1)' cannot be converted to 'Module1.D(Of IComparable, Module1.B2)' because 'Module1.B2' is not derived from 'Module1.B1', as required for the 'In' generic parameter 'S' in 'Delegate Sub Module1.D(Of In T, In S)()'.
        Dim y2 As D(Of System.IComparable, B2) = x2
                                                 ~~
BC36755: 'Module1.D(Of IComparable, Module1.B2)' cannot be converted to 'Module1.D(Of Integer, Module1.B1)' because 'Module1.B1' is not derived from 'Module1.B2', as required for the 'In' generic parameter 'S' in 'Delegate Sub Module1.D(Of In T, In S)()'.
        x2 = y2
             ~~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions11()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Delegate Sub D(Of In T)()
 
    Interface I123(Of In T)
    End Interface
 
    Public Sub Goo7(Of T As {I123(Of D(Of Q())), I123(Of D(Of S()))}, S As Structure, Q, R As Q)()
        Dim a As D(Of R()) = Nothing
        Dim b As D(Of Q()) = a
 
        Dim x As T = Nothing
        Dim z As I123(Of D(Of R())) = x
 
        Dim x1 As T() = Nothing
        Dim z1 As I123(Of D(Of R()))() = x1
    End Sub
 
    Sub Main()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'Module1.D(Of R())' to 'Module1.D(Of Q())'; this conversion may fail because 'Q()' is not derived from 'R()', as required for the 'In' generic parameter 'T' in 'Delegate Sub Module1.D(Of In T)()'.
        Dim b As D(Of Q()) = a
                             ~
BC42016: Conversion from 'T' to 'Module1.I123(Of Module1.D(Of R()))' may be ambiguous.
        Dim z As I123(Of D(Of R())) = x
                                      ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of Module1.D(Of R()))()' may be ambiguous.
        Dim z1 As I123(Of D(Of R()))() = x1
                                         ~~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub OverestimateNarrowingConversions12()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections.Generic
 
Module Module1
 
    Delegate Sub D(Of In T)()
 
    Interface I123(Of In T)
    End Interface
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Sub Goo1(Of T As {I123(Of D(Of B1)), I123(Of D(Of S))}, S, Q As {Class, I123(Of D(Of B1))})(x As T, y As S, z As I123(Of D(Of S)), u As Q)
        Dim p1 As I123(Of D(Of B2)) = x
        p1 = z
        p1 = u
 
        Dim a1 As T() = Nothing
        Dim a2 As Q() = Nothing
        Dim a3 As I123(Of D(Of B2))() = a1
        a3 = a2
    End Sub
 
    Sub Main()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Conversion from 'T' to 'Module1.I123(Of Module1.D(Of Module1.B2))' may be ambiguous.
        Dim p1 As I123(Of D(Of B2)) = x
                                      ~
BC42016: Implicit conversion from 'Module1.I123(Of Module1.D(Of S))' to 'Module1.I123(Of Module1.D(Of Module1.B2))'; this conversion may fail because 'Module1.D(Of Module1.B2)' is not derived from 'Module1.D(Of S)', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
        p1 = z
             ~
BC42016: Implicit conversion from 'Q' to 'Module1.I123(Of Module1.D(Of Module1.B2))'; this conversion may fail because 'Module1.D(Of Module1.B2)' is not derived from 'Module1.D(Of Module1.B1)', as required for the 'In' generic parameter 'T' in 'Interface I123(Of In T)'.
        p1 = u
             ~
BC42016: Conversion from 'T()' to 'Module1.I123(Of Module1.D(Of Module1.B2))()' may be ambiguous.
        Dim a3 As I123(Of D(Of B2))() = a1
                                        ~~
BC42016: Implicit conversion from 'Q()' to 'Module1.I123(Of Module1.D(Of Module1.B2))()'.
        a3 = a2
             ~~
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub Delegate3()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Delegate Function D(Of T, S)(x As T) As S
 
    Sub Main()
        Dim x As D(Of B1, B2) = Function(p As B1) As B2
                                    System.Console.WriteLine("Function(p As B1) As B2 - {0}", p)
                                    Return New B2()
                                End Function
        Dim y As D(Of B2, B1) = x
        y(New B2())
 
        x = Nothing
        x = y
        x(New B1())
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC36757: 'Module1.D(Of Module1.B1, Module1.B2)' cannot be converted to 'Module1.D(Of Module1.B2, Module1.B1)'. Consider changing the 'S' in the definition of 'Delegate Function Module1.D(Of T, S)(x As T) As S' to an Out type parameter, 'Out S'.
        Dim y As D(Of B2, B1) = x
                                ~
BC36757: 'Module1.D(Of Module1.B2, Module1.B1)' cannot be converted to 'Module1.D(Of Module1.B1, Module1.B2)'. Consider changing the 'T' in the definition of 'Delegate Function Module1.D(Of T, S)(x As T) As S' to an Out type parameter, 'Out T'.
        x = y
            ~
</expected>)
        End Sub
 
        <Fact>
        Public Sub Delegate4()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Delegate Function D(Of T, S)(x As T) As S
 
    Sub Main()
        Dim y As D(Of B1, B1) = Nothing
        Dim x As D(Of B1, B2) = y
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC36758: 'Module1.D(Of Module1.B1, Module1.B1)' cannot be converted to 'Module1.D(Of Module1.B1, Module1.B2)'. Consider changing the 'S' in the definition of 'Delegate Function Module1.D(Of T, S)(x As T) As S' to an In type parameter, 'In S'.
        Dim x As D(Of B1, B2) = y
                                ~
</expected>)
        End Sub
 
        <Fact>
        Public Sub VarianceConversionSuggestion1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
Imports System.Collections
Imports System.Collections.Generic
 
Module Module1
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Class B3
        Inherits List(Of B2)
    End Class
 
    Class B4
        Inherits List(Of B1)
    End Class
 
    Class B5
        Inherits System.Collections.ObjectModel.Collection(Of B2)
    End Class
 
    Class B6
        Inherits System.Collections.ObjectModel.Collection(Of B1)
    End Class
 
    Class B7
        Inherits System.Collections.ObjectModel.ReadOnlyCollection(Of B2)
 
        Sub New()
            MyBase.New(Nothing)
        End Sub
    End Class
 
    Class B8
        Inherits System.Collections.ObjectModel.ReadOnlyCollection(Of B1)
 
        Sub New()
            MyBase.New(Nothing)
        End Sub
    End Class
 
    Class B9(Of T)
        Implements IList(Of T)
 
        Public Sub Add(item As T) Implements ICollection(Of T).Add
        End Sub
 
        Public Sub Clear() Implements ICollection(Of T).Clear
        End Sub
 
        Public Function Contains(item As T) As Boolean Implements ICollection(Of T).Contains
            Return Nothing
        End Function
 
        Public Sub CopyTo(array() As T, arrayIndex As Integer) Implements ICollection(Of T).CopyTo
        End Sub
 
        Public ReadOnly Property Count As Integer Implements ICollection(Of T).Count
            Get
                Return Nothing
            End Get
        End Property
 
        Public ReadOnly Property IsReadOnly As Boolean Implements ICollection(Of T).IsReadOnly
            Get
                Return Nothing
            End Get
        End Property
 
        Public Function Remove(item As T) As Boolean Implements ICollection(Of T).Remove
            Return Nothing
        End Function
 
        Public Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
            Return Nothing
        End Function
 
        Public Function IndexOf(item As T) As Integer Implements IList(Of T).IndexOf
            Return Nothing
        End Function
 
        Public Sub Insert(index As Integer, item As T) Implements IList(Of T).Insert
        End Sub
 
        Default Public Property Item(index As Integer) As T Implements IList(Of T).Item
            Get
                Return Nothing
            End Get
            Set(value As T)
            End Set
        End Property
 
        Public Sub RemoveAt(index As Integer) Implements IList(Of T).RemoveAt
        End Sub
 
        Public Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator
            Return Nothing
        End Function
    End Class
 
    Class B10(Of T)
        Implements ICollection(Of T)
 
        Public Sub Add(item As T) Implements ICollection(Of T).Add
        End Sub
 
        Public Sub Clear() Implements ICollection(Of T).Clear
        End Sub
 
        Public Function Contains(item As T) As Boolean Implements ICollection(Of T).Contains
            Return Nothing
        End Function
 
        Public Sub CopyTo(array() As T, arrayIndex As Integer) Implements ICollection(Of T).CopyTo
        End Sub
 
        Public ReadOnly Property Count As Integer Implements ICollection(Of T).Count
            Get
                Return Nothing
            End Get
        End Property
 
        Public ReadOnly Property IsReadOnly As Boolean Implements ICollection(Of T).IsReadOnly
            Get
                Return Nothing
            End Get
        End Property
 
        Public Function Remove(item As T) As Boolean Implements ICollection(Of T).Remove
            Return Nothing
        End Function
 
        Public Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
            Return Nothing
        End Function
 
        Public Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator
            Return Nothing
        End Function
    End Class
 
    Class B11(Of T, U)
        Inherits B9(Of T)
        Implements ICollection(Of U)
 
        Public Sub Add1(item As U) Implements ICollection(Of U).Add
        End Sub
 
        Public Sub Clear1() Implements ICollection(Of U).Clear
        End Sub
 
        Public Function Contains1(item As U) As Boolean Implements ICollection(Of U).Contains
            Return Nothing
        End Function
 
        Public Sub CopyTo1(array() As U, arrayIndex As Integer) Implements ICollection(Of U).CopyTo
        End Sub
 
        Public ReadOnly Property Count1 As Integer Implements ICollection(Of U).Count
            Get
                Return Nothing
            End Get
        End Property
 
        Public ReadOnly Property IsReadOnly1 As Boolean Implements ICollection(Of U).IsReadOnly
            Get
                Return Nothing
            End Get
        End Property
 
        Public Function Remove1(item As U) As Boolean Implements ICollection(Of U).Remove
            Return Nothing
        End Function
 
        Public Function GetEnumerator2() As IEnumerator(Of U) Implements IEnumerable(Of U).GetEnumerator
            Return Nothing
        End Function
    End Class
 
    Sub Main()
 
        Dim a As List(Of B1) = New B3()
        Dim b As List(Of B2) = New B4()
 
        Dim c As System.Collections.ObjectModel.Collection(Of B1) = New B5()
        Dim d As System.Collections.ObjectModel.Collection(Of B2) = New B6()
 
        Dim e As System.Collections.ObjectModel.ReadOnlyCollection(Of B1) = New B7()
        Dim f As System.Collections.ObjectModel.ReadOnlyCollection(Of B2) = New B8()
 
        Dim g As IList(Of B1) = New B9(Of B2)()
        Dim h As IList(Of B2) = New B9(Of B1)()
 
        g = New B10(Of B2)()
        h = New B10(Of B1)()
 
        Dim i As ICollection(Of B1) = New B9(Of B2)()
        Dim j As ICollection(Of B2) = New B9(Of B1)()
 
        i = New B10(Of B2)()
        j = New B10(Of B1)()
 
        i = New B11(Of B2, B3)()
        j = New B11(Of B1, B3)()
 
        i = New B11(Of B2, B2)()
        j = New B11(Of B3, B3)()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC36756: 'Module1.B3' cannot be converted to 'List(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim a As List(Of B1) = New B3()
                               ~~~~~~~~
BC30311: Value of type 'Module1.B4' cannot be converted to 'List(Of Module1.B2)'.
        Dim b As List(Of B2) = New B4()
                               ~~~~~~~~
BC36756: 'Module1.B5' cannot be converted to 'Collection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim c As System.Collections.ObjectModel.Collection(Of B1) = New B5()
                                                                    ~~~~~~~~
BC30311: Value of type 'Module1.B6' cannot be converted to 'Collection(Of Module1.B2)'.
        Dim d As System.Collections.ObjectModel.Collection(Of B2) = New B6()
                                                                    ~~~~~~~~
BC36756: 'Module1.B7' cannot be converted to 'ReadOnlyCollection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim e As System.Collections.ObjectModel.ReadOnlyCollection(Of B1) = New B7()
                                                                            ~~~~~~~~
BC30311: Value of type 'Module1.B8' cannot be converted to 'ReadOnlyCollection(Of Module1.B2)'.
        Dim f As System.Collections.ObjectModel.ReadOnlyCollection(Of B2) = New B8()
                                                                            ~~~~~~~~
BC42016: 'Module1.B9(Of Module1.B2)' cannot be converted to 'IList(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim g As IList(Of B1) = New B9(Of B2)()
                                ~~~~~~~~~~~~~~~
BC42016: Implicit conversion from 'Module1.B9(Of Module1.B1)' to 'IList(Of Module1.B2)'.
        Dim h As IList(Of B2) = New B9(Of B1)()
                                ~~~~~~~~~~~~~~~
BC42016: Implicit conversion from 'Module1.B10(Of Module1.B2)' to 'IList(Of Module1.B1)'.
        g = New B10(Of B2)()
            ~~~~~~~~~~~~~~~~
BC42016: Implicit conversion from 'Module1.B10(Of Module1.B1)' to 'IList(Of Module1.B2)'.
        h = New B10(Of B1)()
            ~~~~~~~~~~~~~~~~
BC42016: 'Module1.B9(Of Module1.B2)' cannot be converted to 'ICollection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim i As ICollection(Of B1) = New B9(Of B2)()
                                      ~~~~~~~~~~~~~~~
BC42016: Implicit conversion from 'Module1.B9(Of Module1.B1)' to 'ICollection(Of Module1.B2)'.
        Dim j As ICollection(Of B2) = New B9(Of B1)()
                                      ~~~~~~~~~~~~~~~
BC42016: 'Module1.B10(Of Module1.B2)' cannot be converted to 'ICollection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        i = New B10(Of B2)()
            ~~~~~~~~~~~~~~~~
BC42016: Implicit conversion from 'Module1.B10(Of Module1.B1)' to 'ICollection(Of Module1.B2)'.
        j = New B10(Of B1)()
            ~~~~~~~~~~~~~~~~
BC42016: Implicit conversion from 'Module1.B11(Of Module1.B2, Module1.B3)' to 'ICollection(Of Module1.B1)'.
        i = New B11(Of B2, B3)()
            ~~~~~~~~~~~~~~~~~~~~
BC42016: Implicit conversion from 'Module1.B11(Of Module1.B1, Module1.B3)' to 'ICollection(Of Module1.B2)'.
        j = New B11(Of B1, B3)()
            ~~~~~~~~~~~~~~~~~~~~
BC42016: 'Module1.B11(Of Module1.B2, Module1.B2)' cannot be converted to 'ICollection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        i = New B11(Of B2, B2)()
            ~~~~~~~~~~~~~~~~~~~~
BC42016: Implicit conversion from 'Module1.B11(Of Module1.B3, Module1.B3)' to 'ICollection(Of Module1.B2)'.
        j = New B11(Of B3, B3)()
            ~~~~~~~~~~~~~~~~~~~~
</expected>)
 
            compilation = compilation.WithOptions(compilation.Options.WithOptionStrict(OptionStrict.On))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC36756: 'Module1.B3' cannot be converted to 'List(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim a As List(Of B1) = New B3()
                               ~~~~~~~~
BC30311: Value of type 'Module1.B4' cannot be converted to 'List(Of Module1.B2)'.
        Dim b As List(Of B2) = New B4()
                               ~~~~~~~~
BC36756: 'Module1.B5' cannot be converted to 'Collection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim c As System.Collections.ObjectModel.Collection(Of B1) = New B5()
                                                                    ~~~~~~~~
BC30311: Value of type 'Module1.B6' cannot be converted to 'Collection(Of Module1.B2)'.
        Dim d As System.Collections.ObjectModel.Collection(Of B2) = New B6()
                                                                    ~~~~~~~~
BC36756: 'Module1.B7' cannot be converted to 'ReadOnlyCollection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim e As System.Collections.ObjectModel.ReadOnlyCollection(Of B1) = New B7()
                                                                            ~~~~~~~~
BC30311: Value of type 'Module1.B8' cannot be converted to 'ReadOnlyCollection(Of Module1.B2)'.
        Dim f As System.Collections.ObjectModel.ReadOnlyCollection(Of B2) = New B8()
                                                                            ~~~~~~~~
BC36756: 'Module1.B9(Of Module1.B2)' cannot be converted to 'IList(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim g As IList(Of B1) = New B9(Of B2)()
                                ~~~~~~~~~~~~~~~
BC30512: Option Strict On disallows implicit conversions from 'Module1.B9(Of Module1.B1)' to 'IList(Of Module1.B2)'.
        Dim h As IList(Of B2) = New B9(Of B1)()
                                ~~~~~~~~~~~~~~~
BC30512: Option Strict On disallows implicit conversions from 'Module1.B10(Of Module1.B2)' to 'IList(Of Module1.B1)'.
        g = New B10(Of B2)()
            ~~~~~~~~~~~~~~~~
BC30512: Option Strict On disallows implicit conversions from 'Module1.B10(Of Module1.B1)' to 'IList(Of Module1.B2)'.
        h = New B10(Of B1)()
            ~~~~~~~~~~~~~~~~
BC36756: 'Module1.B9(Of Module1.B2)' cannot be converted to 'ICollection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        Dim i As ICollection(Of B1) = New B9(Of B2)()
                                      ~~~~~~~~~~~~~~~
BC30512: Option Strict On disallows implicit conversions from 'Module1.B9(Of Module1.B1)' to 'ICollection(Of Module1.B2)'.
        Dim j As ICollection(Of B2) = New B9(Of B1)()
                                      ~~~~~~~~~~~~~~~
BC36756: 'Module1.B10(Of Module1.B2)' cannot be converted to 'ICollection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        i = New B10(Of B2)()
            ~~~~~~~~~~~~~~~~
BC30512: Option Strict On disallows implicit conversions from 'Module1.B10(Of Module1.B1)' to 'ICollection(Of Module1.B2)'.
        j = New B10(Of B1)()
            ~~~~~~~~~~~~~~~~
BC30512: Option Strict On disallows implicit conversions from 'Module1.B11(Of Module1.B2, Module1.B3)' to 'ICollection(Of Module1.B1)'.
        i = New B11(Of B2, B3)()
            ~~~~~~~~~~~~~~~~~~~~
BC30512: Option Strict On disallows implicit conversions from 'Module1.B11(Of Module1.B1, Module1.B3)' to 'ICollection(Of Module1.B2)'.
        j = New B11(Of B1, B3)()
            ~~~~~~~~~~~~~~~~~~~~
BC36756: 'Module1.B11(Of Module1.B2, Module1.B2)' cannot be converted to 'ICollection(Of Module1.B1)'. Consider using 'IEnumerable(Of Module1.B1)' instead.
        i = New B11(Of B2, B2)()
            ~~~~~~~~~~~~~~~~~~~~
BC30512: Option Strict On disallows implicit conversions from 'Module1.B11(Of Module1.B3, Module1.B3)' to 'ICollection(Of Module1.B2)'.
        j = New B11(Of B3, B3)()
            ~~~~~~~~~~~~~~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub VarianceConversionSuggestion2()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Class B1
    End Class
 
    Class B2
        Inherits B1
    End Class
 
    Interface I123(Of T, S)
    End Interface
 
    Sub Main()
        Dim y As I123(Of B1, B1) = Nothing
        Dim x As I123(Of B1, B2) = y
 
        Dim y1 As I123(Of B2, B1) = Nothing
        Dim x1 As I123(Of B1, B2) = y1
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: 'Module1.I123(Of Module1.B1, Module1.B1)' cannot be converted to 'Module1.I123(Of Module1.B1, Module1.B2)'. Consider changing the 'S' in the definition of 'Interface I123(Of T, S)' to an In type parameter, 'In S'.
        Dim x As I123(Of B1, B2) = y
                                   ~
BC42016: 'Module1.I123(Of Module1.B2, Module1.B1)' cannot be converted to 'Module1.I123(Of Module1.B1, Module1.B2)'. Consider changing the 'T' in the definition of 'Interface I123(Of T, S)' to an Out type parameter, 'Out T'.
        Dim x1 As I123(Of B1, B2) = y1
                                    ~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub InfiniteRecursion1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Imports System
 
Interface W(Of In U) : End Interface
Interface X(Of T) : Inherits W(Of W(Of X(Of X(Of T)))) : End Interface
Class T2 : Implements X(Of Double) : End Class
Module Test2
    Sub Test()
        Dim t As X(Of Double) = New T2
        Dim u As W(Of X(Of String)) = t  ' BC36755/42106 underspecified: we don't know whether the CLR will allow this
        Dim v As W(Of X(Of String)) = CType(t, W(Of X(Of String)))
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseDll.WithOptionStrict(OptionStrict.Custom))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42016: Implicit conversion from 'X(Of Double)' to 'W(Of X(Of String))'; this conversion may fail because 'X(Of String)' is not derived from 'W(Of X(Of X(Of Double)))', as required for the 'In' generic parameter 'U' in 'Interface W(Of In U)'.
        Dim u As W(Of X(Of String)) = t  ' BC36755/42106 underspecified: we don't know whether the CLR will allow this
                                      ~
</expected>)
 
            compilation = compilation.WithOptions(compilation.Options.WithOptionStrict(OptionStrict.On))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC36755: 'X(Of Double)' cannot be converted to 'W(Of X(Of String))' because 'X(Of String)' is not derived from 'W(Of X(Of X(Of Double)))', as required for the 'In' generic parameter 'U' in 'Interface W(Of In U)'.
        Dim u As W(Of X(Of String)) = t  ' BC36755/42106 underspecified: we don't know whether the CLR will allow this
                                      ~
</expected>)
        End Sub
 
        <Fact>
        Public Sub ConstraintsOnGenericMethod()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Option Strict On
Imports System
Imports System.Collections.Generic
Module Module1
    Class B1
    End Class
    Class B2
        Inherits B1
    End Class
    Class Program
        Shared Function Goo(Of T As U, U)(ByVal arg As T) As U
            Console.WriteLine(TypeOf arg Is IEnumerable(Of B2))
            Return arg
        End Function
 
        Shared Sub Main()
            Dim btnList As IEnumerable(Of B2) = New List(Of B2)()
            'This is allowed because it satisfies the constraint IEnumerable(Of B1) AS IEnumerable(Of B2)
            Dim _ctrlCol As IEnumerable(Of B1) = Goo(Of IEnumerable(Of B2), IEnumerable(Of B1))(btnList)
        End Sub
    End Class
End Module
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef, options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom),
                             expectedOutput:=
            <![CDATA[
True
]]>)
 
            CompilationUtils.AssertTheseDiagnostics(verifier.Compilation,
<expected>
</expected>)
 
        End Sub
 
        <Fact>
        Public Sub UserDefinedConversions1()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Option Strict On
Imports System
Module Module1
    Class A
    End Class
    Class B
        Inherits A
    End Class
    Class C
        Overloads Shared Widening Operator CType(ByVal arg As C) As Func(Of A)
            Return Function() New A
        End Operator
    End Class
    Class D
        Inherits C
        Overloads Shared Widening Operator CType(ByVal arg As D) As Func(Of B)
            Return Function() New B
        End Operator
    End Class
    Sub Main()
        'Variance ambiguity error, because there will be another widening path(D-->Func(Of B)--[Covariance]-->Func(Of A)
        Dim _func As Func(Of A) = New D()
    End Sub
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseDll.WithOptionStrict(OptionStrict.On))
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30311: Value of type 'Module1.D' cannot be converted to 'Func(Of Module1.A)'.
        Dim _func As Func(Of A) = New D()
                                  ~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub UserDefinedConversions2()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Option Strict On
Imports System
Module Module1
    Class A
    End Class
    Class B
        Inherits A
    End Class
    Class C
        Overloads Shared Narrowing Operator CType(ByVal arg As C) As Func(Of A)
            Return Function() New A
        End Operator
 
        Overloads Shared Widening Operator CType(ByVal arg As C) As Func(Of B)
            Console.WriteLine("T1->Func(Of B)")
            Return Function() New B
        End Operator
    End Class
 
    Sub Main()
        'The conversion will succeed using Variance->Func(Of B)-[Covariance]-Func(Of A)
        Dim _func As Func(Of A) = New C()
    End Sub
End Module
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef, options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On),
                      expectedOutput:=
            <![CDATA[
T1->Func(Of B)
]]>)
 
            CompilationUtils.AssertTheseDiagnostics(verifier.Compilation,
<expected>
</expected>)
        End Sub
 
        <WorkItem(545815, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545815")>
        <Fact>
        Public Sub Bug14483()
            Dim compilationDef =
<compilation name="SimpleTest1">
    <file name="a.vb">
Option Strict On
 
Imports System
 
Module Module1
 
    Sub Main()
 
        Dim ao As Action(Of Object) = Sub(a As Object)
                                      End Sub
        Dim ad As Action(Of D) = ao
        Console.WriteLine(ad.GetType)
 
        ' One Level Nesting
        ' ContraVariance nested in Variance
        Dim fao As Func(Of Action(Of Object)) = Function() ao
        Dim fad As Func(Of Action(Of D)) = fao
 
        Dim fac_1 As Func(Of Action(Of C)) = CType(fad, Func(Of Action(Of C)))
        Console.WriteLine(fac_1.GetType)
 
        ' ContraVariance nested in ContraVariance
        ' We only test this with Strict off, 
        ' since Dim aad As Action(Of Action(Of D)) = aao is narrowing conversion
 
        Dim aao As Action(Of Action(Of Object)) = ao
        Dim aad As Action(Of Action(Of D)) = CType(aao, Action(Of Action(Of D)))
        Dim aac As Action(Of Action(Of C)) = CType(aad, Action(Of Action(Of C)))
        Console.WriteLine(aac.GetType)
 
        ' Two Level Nesting
        ' ContraVariance Nested in Variance
        Dim ffao As Func(Of Func(Of Action(Of Object))) = Function() fao
        Dim ffad As Func(Of Func(Of Action(Of D))) = ffao
 
        Dim ffac_1 As Func(Of Func(Of Action(Of C))) = CType(ffad, Func(Of Func(Of Action(Of C))))
        Console.WriteLine(ffac_1.GetType)
    End Sub
 
    Sub Goo(ByVal f As C)
        Console.WriteLine(f.GetType)
    End Sub
 
    Class C : End Class
 
    Class D : End Class
 
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
 
            Dim verifier = CompileAndVerify(compilation,
                      expectedOutput:=
            <![CDATA[
System.Action`1[System.Object]
System.Func`1[System.Action`1[System.Object]]
System.Action`1[System.Object]
System.Func`1[System.Func`1[System.Action`1[System.Object]]]
]]>)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
</expected>)
        End Sub
 
    End Class
 
End Namespace