/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Semantic/Semantics/OverloadResolutionPriorityTests.vb
4 627 строк
137 KB
AlekseyTs
Report inappropriate OverloadResolutionPriority attribute applications (#76385)
13 дек 2024, 20:21
Не верифицирован
13 дек 2024, 20:21
0e1d246
Код
Авторство
О чём код?
' 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 Microsoft.CodeAnalysis.CSharp Imports Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Symbols.Retargeting Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Public Class OverloadResolutionPriorityTests Inherits BasicTestBase Private Const OverloadResolutionPriorityAttributeDefinitionCS As String = " namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] public sealed class OverloadResolutionPriorityAttribute(int priority) : Attribute { public int Priority => priority; } } " Private Const OverloadResolutionPriorityAttributeDefinitionVB As String = " namespace System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.Method Or AttributeTargets.Constructor Or AttributeTargets.Property, AllowMultiple:= false, Inherited:= false)> public class OverloadResolutionPriorityAttribute Inherits Attribute Public Sub New(priority As Integer) Me.Priority = priority End Sub public Readonly Property Priority As Integer End Class End Namespace " Private Const OverloadResolutionPriorityAttributeILDefinition As String = " .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute extends [mscorlib]System.Attribute { .custom instance void [mscorlib]System.AttributeUsageAttribute::.ctor(valuetype [mscorlib]System.AttributeTargets) = ( 01 00 e0 00 00 00 02 00 54 02 0d 41 6c 6c 6f 77 4d 75 6c 74 69 70 6c 65 00 54 02 09 49 6e 68 65 72 69 74 65 64 00 ) .field private int32 '<priority>P' .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .method public hidebysig specialname rtspecialname instance void .ctor ( int32 priority ) cil managed { ldarg.0 ldarg.1 stfld int32 System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::'<priority>P' ldarg.0 call instance void [mscorlib]System.Attribute::.ctor() ret } .method public hidebysig specialname instance int32 get_Priority () cil managed { ldarg.0 ldfld int32 System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::'<priority>P' ret } .property instance int32 Priority() { .get instance int32 System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::get_Priority() } } " <Theory, CombinatorialData> Public Sub IncreasedPriorityWins_01_CS(i1First As Boolean) Dim i1Source = " [OverloadResolutionPriority(1)] public static void M(I1 x) => System.Console.WriteLine(1); " Dim i2Source = " public static void M(I2 x) => throw null; " Dim reference = CreateCSharpCompilation(" using System.Runtime.CompilerServices; public interface I1 {} public interface I2 {} public interface I3 : I1, I2 {} public class C {" + If(i1First, i1Source, i2Source) + If(i1First, i2Source, i1Source) + " } " + OverloadResolutionPriorityAttributeDefinitionCS, parseOptions:=New CSharpParseOptions(CSharp.LanguageVersion.Latest)).EmitToImageReference() Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) End Sub End Class " Dim compilation = CreateCompilation(source, references:={reference}, options:=TestOptions.DebugExe) Dim c = compilation.GetTypeByMetadataName("C") Dim ms = c.GetMembers("M").Cast(Of MethodSymbol)() For Each m In ms Assert.Equal(If(m.Parameters(0).Type.Name = "I1", 1, 0), m.OverloadResolutionPriority) Next CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() End Sub <Theory, CombinatorialData> Public Sub IncreasedPriorityWins_01(i1First As Boolean) Dim i1Source = " <OverloadResolutionPriority(1)> public Shared Sub M(x As I1) System.Console.WriteLine(1) End Sub " Dim i2Source = " public Shared Sub M(x As I2) throw DirectCast(Nothing, System.Exception) End Sub " Dim reference = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C" + If(i1First, i1Source, i2Source) + If(i1First, i2Source, i1Source) + " End Class " Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) Dim validate = Sub([module] As ModuleSymbol) Dim c = [module].ContainingAssembly.GetTypeByMetadataName("C") Dim ms = c.GetMembers("M").Cast(Of MethodSymbol)() For Each m In ms Assert.Equal(If(m.Parameters(0).Type.Name = "I1", 1, 0), m.OverloadResolutionPriority) Next End Sub CompileAndVerify(comp1, expectedOutput:="1", sourceSymbolValidator:=validate, symbolValidator:=validate).VerifyDiagnostics() Dim compilationReference As CompilationReference = comp1.ToMetadataReference() Dim comp2 = CreateCompilation(source, references:={compilationReference}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="1").VerifyDiagnostics() Dim metadataReference As MetadataReference = comp1.EmitToImageReference() Dim comp3 = CreateCompilation(source, references:={metadataReference}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="1").VerifyDiagnostics() comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular17_13) CompileAndVerify(comp1, expectedOutput:="1", sourceSymbolValidator:=validate, symbolValidator:=validate).VerifyDiagnostics() comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) comp1.AssertTheseDiagnostics(If(i1First, <expected><![CDATA[ BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared Sub M(x As I1)': Not most specific. 'Public Shared Sub M(x As I2)': Not most specific. C.M(i3) ~ BC36716: Visual Basic 16.9 does not support overload resolution priority. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>, <expected><![CDATA[ BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared Sub M(x As I2)': Not most specific. 'Public Shared Sub M(x As I1)': Not most specific. C.M(i3) ~ BC36716: Visual Basic 16.9 does not support overload resolution priority. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>)) comp2 = CreateCompilation(source, references:={compilationReference}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) Dim expected = If(i1First, <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared Sub M(x As I1)': Not most specific. 'Public Shared Sub M(x As I2)': Not most specific. C.M(i3) ~ </expected>, <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared Sub M(x As I2)': Not most specific. 'Public Shared Sub M(x As I1)': Not most specific. C.M(i3) ~ </expected>) comp2.AssertTheseDiagnostics(expected) comp3 = CreateCompilation(source, references:={metadataReference}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) comp3.AssertTheseDiagnostics(expected) End Sub <Theory, CombinatorialData> Public Sub Accessibility_01(i1First As Boolean) Dim i1Source = " <OverloadResolutionPriority(1)> protected Shared Sub M(x As I1) System.Console.WriteLine(1) End Sub " Dim i2Source = " public Shared Sub M(x As I2) System.Console.WriteLine(2) End Sub " Dim reference = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C" + If(i1First, i1Source, i2Source) + If(i1First, i2Source, i1Source) + " End Class " Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp1, expectedOutput:="2").VerifyDiagnostics() Dim comp2 = CreateCompilation(source, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="2").VerifyDiagnostics() Dim comp3 = CreateCompilation(source, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="2").VerifyDiagnostics() End Sub <Fact> Public Sub EarlyFilteringByParamArray() Dim source = " Imports System Module Program Sub Main() Dim t As new Test1 t.M1(1) t.M2(1) End Sub End Module Class Test1 Sub M1(s As Integer) Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(ParamArray s As Integer()) Console.Write(2) End Sub Sub M2(s As Integer) Console.Write(3) End Sub Sub M2(ParamArray s As Integer()) Console.Write(4) End Sub End Class " Dim compilation = CompilationUtils.CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="23") End Sub <Fact> Public Sub EarlyFilteringOnExtensionMethodTargetTypeGenericity() Dim source = " Module Program Sub Main() Dim t As new Integer?(1) t.M1() t.M2() End Sub End Module " Dim reference = " Imports System Imports System.Runtime.CompilerServices Public Module Test1 <Extension> Sub M1(s As Integer?) Console.Write(1) End Sub <OverloadResolutionPriority(1)> <Extension> Sub M1(Of T As Structure)(s As T?) Console.Write(2) End Sub <Extension> Sub M2(s As Integer?) Console.Write(3) End Sub <Extension> Sub M2(Of T As Structure)(s As T?) Console.Write(4) End Sub End Module " Dim compilation = CompilationUtils.CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="23") compilation = CompilationUtils.CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular17_13) CompileAndVerify(compilation, expectedOutput:="23") compilation = CompilationUtils.CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16.9 does not support overload resolution priority. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) Dim ref = CompilationUtils.CreateCompilation({reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) compilation = CompilationUtils.CreateCompilation(source, references:={ref.ToMetadataReference()}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) CompileAndVerify(compilation, expectedOutput:="13") compilation = CompilationUtils.CreateCompilation(source, references:={ref.EmitToImageReference()}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) CompileAndVerify(compilation, expectedOutput:="13") End Sub <Fact> Public Sub EarlyFilteringOnReceiverType_01() Dim source = " Imports System Imports System.Runtime.CompilerServices Module Program Sub Main() Dim t = 1.ToString() t.M1() t.M2() End Sub End Module Module Test1 <Extension> Sub M1(s As String) Console.Write(1) End Sub <OverloadResolutionPriority(1)> <Extension> Sub M1(s As Object) Console.Write(2) End Sub <Extension> Sub M2(s As String) Console.Write(3) End Sub <Extension> Sub M2(s As Object) Console.Write(4) End Sub End Module " Dim compilation = CompilationUtils.CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="23") End Sub <Fact> Public Sub EarlyFilteringOnReceiverType_02() Dim source = " Imports System Module Program Sub Main() Dim t As new Test2 t.M1(1.ToString()) t.M2(1.ToString()) End Sub End Module Class Test1 overridable Sub M1(s As String) Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(s As Object) Console.Write(2) End Sub overridable Sub M2(s As String) Console.Write(4) End Sub Sub M2(s As Object) Console.Write(5) End Sub End Class Class Test2 Inherits Test1 overrides Sub M1(s As String) Console.Write(3) End Sub overrides Sub M2(s As String) Console.Write(6) End Sub End Class " Dim compilation = CompilationUtils.CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="26") End Sub <Fact> Public Sub EarlyFiltering_OnReceiverType_03() Dim source = " Imports System Module Program Sub Main() Dim t As new Test2 t.M1(1.ToString()) t.M2(1.ToString()) End Sub End Module Class Test1 overridable Sub M1(s As String) Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(s As String, Optional x as Integer = 0) Console.Write(2) End Sub overridable Sub M2(s As String) Console.Write(4) End Sub Sub M2(s As String, Optional x as Integer = 0) Console.Write(5) End Sub End Class Class Test2 Inherits Test1 overrides Sub M1(s As String) Console.Write(3) End Sub overrides Sub M2(s As String) Console.Write(6) End Sub End Class " Dim compilation = CompilationUtils.CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="26") End Sub <Fact> Public Sub TestResolutionBasedOnInferenceKind2() Dim compilationDef = " Option Strict Off Module Module1 Sub Main() Dim val As Integer = 0 M1(1, Function(x As Integer) As Integer Return 2 End Function, 1, val) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(Of T, U)(x As T, y As System.Func(Of Integer, Integer), z As U, ParamArray v() As Long) System.Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(Of T)(x As Integer, y As System.Func(Of Integer, T), z As Integer, v As Integer) System.Console.Write(2) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(Of T, U)(x As T, y As System.Func(Of Integer, T), z As U, v As Long) System.Console.Write(3) End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:="2") End Sub <Fact> Public Sub TestResolutionBasedOnInferenceKind4() Dim compilationDef = " Option Strict Off Module Module1 Sub Main() Dim val As Integer = 0 M1(1, Function(x As Integer) As Integer Return 2 End Function, 1, v:=val) M1(1, Function(x As Integer) As Integer Return 2 End Function, 1, val) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(Of T, U)(x As T, y As System.Func(Of Integer, Integer), z As U, v As Long, ParamArray vv() As Long) System.Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(Of T)(x As Integer, y As System.Func(Of Integer, T), z As Integer, v As Integer) System.Console.Write(2) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(Of T, U)(x As T, y As System.Func(Of Integer, T), z As U, v As Long) System.Console.Write(3) End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:="22") End Sub <Fact> Public Sub NarrowingConversions_01() Dim compilationDef = " Option Strict Off Module Module1 Sub Main() M1(New C1()) M1(DirectCast(New C2(), C0)) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As I1) System.Console.Write(1) End Sub Sub M1(x As I2) System.Console.Write(2) End Sub End Module Interface I1 End Interface Interface I2 End Interface Class C0 End Class Class C1 Inherits C0 Implements I1, I2 End Class Class C2 Inherits C0 Implements I2 End Class " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) ' If the priority filtering for 'M1(DirectCast(New C2(), C0))' was applied - System.InvalidCastException: Unable to cast object of type 'C2' to type 'I1'. compilation.AssertTheseDiagnostics( <expected> BC30519: Overload resolution failed because no accessible 'M1' can be called without a narrowing conversion: 'Public Sub M1(x As I1)': Argument matching parameter 'x' narrows from 'C0' to 'I1'. 'Public Sub M1(x As I2)': Argument matching parameter 'x' narrows from 'C0' to 'I2'. M1(DirectCast(New C2(), C0)) ~~ </expected>) End Sub <Fact> Public Sub NarrowingConversions_02() Dim compilationDef = " Option Strict Off Module Module1 Sub Main() M1(CObj(New C2())) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As I1) System.Console.Write(1) End Sub Sub M1(x As I2) System.Console.Write(2) End Sub End Module Interface I1 End Interface Interface I2 End Interface Class C0 End Class Class C1 Inherits C0 Implements I1, I2 End Class Class C2 Inherits C0 Implements I2 End Class " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) ' If the priority filtering was applied - System.InvalidCastException: Unable to cast object of type 'C2' to type 'I1'. CompileAndVerify(compilation, expectedOutput:="2") End Sub <Fact> Public Sub NarrowingConversions_03() Dim compilationDef = " Module Module1 Sub Main() Try M1(New C0()) Catch ex As System.InvalidCastException System.Console.Write(ex) End Try End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As C1) End Sub Sub M1(x As C2) System.Console.Write(2) End Sub End Module Class C0 public shared narrowing operator CType(x As C0) As C1 throw new System.InvalidCastException() End Operator public shared widening operator CType(x As C0) As C2 return New C2() End Operator End Class Class C1 End Class Class C2 End Class " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On)) CompileAndVerify(compilation, expectedOutput:="2") compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Off)) ' If the priority filtering was applied - System.InvalidCastException : Specified cast is not valid. CompileAndVerify(compilation, expectedOutput:="2") End Sub <Fact> Public Sub DelegateRelaxationLevelNarrowing_01() Dim compilationDef = " Option Strict Off Module Module1 Sub Main() M1(Function() New C1()) M1(Function() DirectCast(New C2(), C0)) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As System.Func(Of I1)) x() System.Console.Write(1) End Sub Sub M1(x As System.Func(Of I2)) x() System.Console.Write(2) End Sub End Module Interface I1 End Interface Interface I2 End Interface Class C0 End Class Class C1 Inherits C0 Implements I1, I2 End Class Class C2 Inherits C0 Implements I2 End Class " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) ' If the priority filtering for 'M1(Function() DirectCast(New C2(), C0))' was applied - System.InvalidCastException: Unable to cast object of type 'C2' to type 'I1'. compilation.AssertTheseDiagnostics( <expected> BC30521: Overload resolution failed because no accessible 'M1' is most specific for these arguments: 'Public Sub M1(x As Func(Of I1))': Not most specific. 'Public Sub M1(x As Func(Of I2))': Not most specific. M1(Function() DirectCast(New C2(), C0)) ~~ </expected>) End Sub <Fact> Public Sub NarrowingFromNumericConstant_01() Dim compilationDef = " Option Strict Off Module Module1 Sub Main() M1(CDbl(0)) End Sub Sub M1(x as Decimal) System.Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As Single) System.Console.Write(2) End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) compilation.AssertTheseDiagnostics( <expected> BC30519: Overload resolution failed because no accessible 'M1' can be called without a narrowing conversion: 'Public Sub M1(x As Decimal)': Argument matching parameter 'x' narrows from 'Double' to 'Decimal'. 'Public Sub M1(x As Single)': Argument matching parameter 'x' narrows from 'Double' to 'Single'. M1(CDbl(0)) ~~ </expected>) End Sub <Fact> Public Sub NarrowingFromNumericConstant_02() Dim compilationDef = " Module Module1 Sub Main() M1(CLng(0)) M2(CLng(0)) End Sub Sub M1(x as Integer) System.Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As UInteger) System.Console.Write(2) End Sub Sub M2(x as Integer) System.Console.Write(3) End Sub Sub M2(x As UInteger) System.Console.Write(4) End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:="13") End Sub <Fact> Public Sub NarrowingFromNumericConstant_03() Dim compilationDef = " Module Module1 Sub Main() M1(CLng(0)) End Sub Sub M1(x as Integer) System.Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As UInteger) System.Console.Write(2) End Sub Sub M1(x As Long) System.Console.Write(3) End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:="3") End Sub <Fact> Public Sub NarrowingFromNumericConstant_04() Dim compilationDef = " Module Module1 Sub Main() M1(Function() CLng(0)) M2(Function() CLng(0)) End Sub Sub M1(x as System.Func(Of Integer)) System.Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As System.Func(Of UInteger)) System.Console.Write(2) End Sub Sub M2(x as System.Func(Of Integer)) System.Console.Write(3) End Sub Sub M2(x As System.Func(Of UInteger)) System.Console.Write(4) End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:="13") End Sub <Fact> Public Sub NarrowingFromNumericConstant_05() Dim compilationDef = " Module Module1 Sub Main() M1(Long.MaxValue) M2(Long.MaxValue) End Sub Sub M1(x as Integer) System.Console.Write(1) End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Sub M1(x As UInteger) System.Console.Write(2) End Sub Sub M2(x as Integer) System.Console.Write(3) End Sub Sub M2(x As UInteger) System.Console.Write(4) End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe.WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="13") compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe.WithOverflowChecks(True)) compilation.AssertTheseDiagnostics( <expected> BC30518: Overload resolution failed because no accessible 'M1' can be called with these arguments: 'Public Sub M1(x As Integer)': Constant expression not representable in type 'Integer'. 'Public Sub M1(x As UInteger)': Constant expression not representable in type 'UInteger'. M1(Long.MaxValue) ~~ BC30518: Overload resolution failed because no accessible 'M2' can be called with these arguments: 'Public Sub M2(x As Integer)': Constant expression not representable in type 'Integer'. 'Public Sub M2(x As UInteger)': Constant expression not representable in type 'UInteger'. M2(Long.MaxValue) ~~ </expected>) End Sub <Theory, CombinatorialData> Public Sub IncreasedPriorityWins_01_CS_Property(i1First As Boolean) Dim i1Source = " [OverloadResolutionPriority(1)] public int this[I1 x] { set { System.Console.WriteLine(1); } } " Dim i2Source = " public int this[I2 x] { set { throw null; } } " Dim reference = CreateCSharpCompilation(" using System.Runtime.CompilerServices; public interface I1 {} public interface I2 {} public interface I3 : I1, I2 {} public class C {" + If(i1First, i1Source, i2Source) + If(i1First, i2Source, i1Source) + " } " + OverloadResolutionPriorityAttributeDefinitionCS, parseOptions:=New CSharpParseOptions(CSharp.LanguageVersion.Latest)).EmitToImageReference() Dim source = " public class Program Shared Sub Main Dim c As New C() Dim i3 As I3 = Nothing c(i3) = 0 End Sub End Class " Dim compilation = CreateCompilation(source, references:={reference}, options:=TestOptions.DebugExe) Dim c = compilation.GetTypeByMetadataName("C") Dim ms = c.GetMembers("Item").Cast(Of PropertySymbol)() For Each m In ms Assert.Equal(If(m.Parameters(0).Type.Name = "I1", 1, 0), m.OverloadResolutionPriority) Next CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() End Sub <Theory, CombinatorialData> Public Sub IncreasedPriorityWins_01_Property(i1First As Boolean) Dim i1Source = " <OverloadResolutionPriority(1)> public Shared WriteOnly Property M(x As I1) As Integer Set System.Console.WriteLine(1) End Set End Property " Dim i2Source = " public Shared WriteOnly Property M(x As I2) As Integer Set throw DirectCast(Nothing, System.Exception) End Set End Property " Dim reference = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C" + If(i1First, i1Source, i2Source) + If(i1First, i2Source, i1Source) + " End Class " Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) = 0 End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) Dim validate = Sub([module] As ModuleSymbol) Dim c = [module].ContainingAssembly.GetTypeByMetadataName("C") Dim ms = c.GetMembers("M").Cast(Of PropertySymbol)() For Each m In ms Assert.Equal(If(m.Parameters(0).Type.Name = "I1", 1, 0), m.OverloadResolutionPriority) Next End Sub CompileAndVerify(comp1, expectedOutput:="1", sourceSymbolValidator:=validate, symbolValidator:=validate).VerifyDiagnostics() Dim compilationReference As CompilationReference = comp1.ToMetadataReference() Dim comp2 = CreateCompilation(source, references:={compilationReference}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="1").VerifyDiagnostics() Dim metadataReference As MetadataReference = comp1.EmitToImageReference() Dim comp3 = CreateCompilation(source, references:={metadataReference}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="1").VerifyDiagnostics() comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular17_13) CompileAndVerify(comp1, expectedOutput:="1", sourceSymbolValidator:=validate, symbolValidator:=validate).VerifyDiagnostics() comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) comp1.AssertTheseDiagnostics(If(i1First, <expected><![CDATA[ BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared WriteOnly Property M(x As I1) As Integer': Not most specific. 'Public Shared WriteOnly Property M(x As I2) As Integer': Not most specific. C.M(i3) = 0 ~ BC36716: Visual Basic 16.9 does not support overload resolution priority. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>, <expected><![CDATA[ BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared WriteOnly Property M(x As I2) As Integer': Not most specific. 'Public Shared WriteOnly Property M(x As I1) As Integer': Not most specific. C.M(i3) = 0 ~ BC36716: Visual Basic 16.9 does not support overload resolution priority. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>)) comp2 = CreateCompilation(source, references:={compilationReference}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) Dim expected = If(i1First, <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared WriteOnly Property M(x As I1) As Integer': Not most specific. 'Public Shared WriteOnly Property M(x As I2) As Integer': Not most specific. C.M(i3) = 0 ~ </expected>, <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared WriteOnly Property M(x As I2) As Integer': Not most specific. 'Public Shared WriteOnly Property M(x As I1) As Integer': Not most specific. C.M(i3) = 0 ~ </expected>) comp2.AssertTheseDiagnostics(expected) comp3 = CreateCompilation(source, references:={metadataReference}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) comp3.AssertTheseDiagnostics(expected) End Sub <Fact> Public Sub ParameterlessProperty_01() Dim compilationDef = " Module Module1 Sub Main() M1 = 0 End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(-1)> WriteOnly Property M1 As Integer Set System.Console.Write(1) End Set End Property WriteOnly Property M1(Optional x As Integer = 0) As Integer Set System.Console.Write(2) End Set End Property End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:="2") End Sub <Fact> Public Sub ParameterlessProperty_02() Dim compilationDef = " Module Module1 Sub Main() M1 = 0 End Sub WriteOnly Property M1 As Integer Set System.Console.Write(1) End Set End Property <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> WriteOnly Property M1(Optional x As Integer = 0) As Integer Set System.Console.Write(2) End Set End Property End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:="2") End Sub <Fact> Public Sub TestObsoleteAttributeCycles() Dim source = " Imports System Public Class Test <Obsolete(""F1 is obsolete"")> <SomeAttr(F1)> Public Const F1 As Integer = 10 <Obsolete(""F2 is obsolete"", True)> <SomeAttr(F3)> Public Const F2 As Integer = 10 <Obsolete(""F3 is obsolete"")> <SomeAttr(F2)> Public Const F3 As Integer = 10 <Obsolete(F4, True)> Public Const F4 As String = ""blah"" <Obsolete(F5)> Public F5 As String = ""blah"" <Obsolete(P1, True)> <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Public ReadOnly Property P1 As String Get Return ""blah"" End Get End Property <Obsolete> <SomeAttr(P2, True)> <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Public ReadOnly Property P2 As String Get Return ""blah"" End Get End Property <Obsolete(Method1)> Public Sub Method1() End Sub <Obsolete()> <SomeAttr1(Method2)> Public Sub Method2() End Sub <Obsolete(F6)> <SomeAttr(F6)> <SomeAttr(F7)> Public Const F6 As String = ""F6 is obsolete"" <Obsolete(F7, True)> <SomeAttr(F6)> <SomeAttr(F7)> Public Const F7 As String = ""F7 is obsolete"" End Class <AttributeUsage(AttributeTargets.All, AllowMultiple:=True)> Public Class SomeAttr Inherits Attribute Public Sub New(x As Integer) End Sub Public Sub New(x As String) End Sub End Class Public Class SomeAttr1 Inherits Attribute Public Sub New(x As Action) End Sub End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC30059: Constant expression is required. <Obsolete(F5)> ~~ BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class. <Obsolete(F5)> ~~ BC30059: Constant expression is required. <Obsolete(P1, True)> ~~ BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class. <Obsolete(P1, True)> ~~ BC30516: Overload resolution failed because no accessible 'New' accepts this number of arguments. <SomeAttr(P2, True)> ~~~~~~~~ BC30059: Constant expression is required. <SomeAttr(P2, True)> ~~ BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class. <SomeAttr(P2, True)> ~~ BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class. <Obsolete(Method1)> ~~~~~~~ BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class. <SomeAttr1(Method2)> ~~~~~~~ ]]></expected> ) End Sub <Fact> Public Sub PropertyInAttribute_01() Dim source = " Imports System <AttributeUsage(AttributeTargets.All, AllowMultiple:=True)> Public Class SomeAttr Inherits Attribute Public Property P1 As Integer Get Return 0 End Get Set End Set End Property <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Public Property P1(ParamArray x As Integer()) As Integer Get Return 0 End Get Set End Set End Property End Class <SomeAttr(P1:=1)> Public Class SomeAttr1 End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}) compilation.AssertNoDiagnostics() Dim attr = compilation.GetTypeByMetadataName("SomeAttr1").GetAttributes().Single() Assert.Equal("SomeAttr(P1:=1)", attr.ToString()) End Sub <Fact> Public Sub PropertyInAttribute_02() Dim source = " Imports System <AttributeUsage(AttributeTargets.All, AllowMultiple:=True)> Public Class SomeAttr Inherits Attribute Public Property P1(Optional x As Integer = 0) As Integer Get Return 0 End Get Set End Set End Property Public Property P2(ParamArray x As Integer()) As Integer Get Return 0 End Get Set End Set End Property End Class <SomeAttr(P1:=1)> <SomeAttr(P2:=2)> Public Class SomeAttr1 End Class " Dim compilation = CreateCompilation(source) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC30658: Property 'P1' with no parameters cannot be found. <SomeAttr(P1:=1)> ~~ BC30658: Property 'P2' with no parameters cannot be found. <SomeAttr(P2:=2)> ~~ ]]></expected> ) End Sub <Fact> Public Sub DefaultProperty_01() Dim compilationDef = " Class Module1 Shared Sub Main() End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(-1)> Default WriteOnly Property M1 As Integer Set System.Console.Write(1) End Set End Property Default WriteOnly Property M1(x As Integer) As Integer Set System.Console.Write(2) End Set End Property End Class " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) compilation.AssertTheseDiagnostics( <expected> BC31048: Properties with no required parameters cannot be declared 'Default'. Default WriteOnly Property M1 As Integer ~~ </expected>) End Sub <Fact> Public Sub DefaultProperty_02() Dim compilationDef = " Class Module1 Shared Sub Main() End Sub <System.Runtime.CompilerServices.OverloadResolutionPriority(-1)> WriteOnly Property M1 As Integer Set System.Console.Write(1) End Set End Property Default WriteOnly Property M1(x As Integer) As Integer Set System.Console.Write(2) End Set End Property End Class " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) compilation.AssertTheseDiagnostics( <expected> BC30361: 'Public WriteOnly Default Property M1(x As Integer) As Integer' and 'Public WriteOnly Property M1 As Integer' cannot overload each other because only one is declared 'Default'. WriteOnly Property M1 As Integer ~~ </expected>) End Sub <Theory, CombinatorialData> Public Sub DefaultProperty_03(i1First As Boolean) Dim i1Source = " <OverloadResolutionPriority(1)> public Default WriteOnly Property M(x As I1) As Integer Set System.Console.Write(1) End Set End Property " Dim i2Source = " public Default WriteOnly Property M(x As I2) As Integer Set throw DirectCast(Nothing, System.Exception) End Set End Property " Dim reference = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C" + If(i1First, i1Source, i2Source) + If(i1First, i2Source, i1Source) + " End Class " Dim source = " public class Program Shared Sub Main Dim c as New C() Dim i3 As I3 = Nothing c.M(i3) = 0 c(i3) = 0 End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) Dim validate = Sub([module] As ModuleSymbol) Dim c = [module].ContainingAssembly.GetTypeByMetadataName("C") Dim ms = c.GetMembers("M").Cast(Of PropertySymbol)() For Each m In ms Assert.Equal(If(m.Parameters(0).Type.Name = "I1", 1, 0), m.OverloadResolutionPriority) Next End Sub CompileAndVerify(comp1, expectedOutput:="11", sourceSymbolValidator:=validate, symbolValidator:=validate).VerifyDiagnostics() Dim comp2 = CreateCompilation(source, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="11").VerifyDiagnostics() Dim comp3 = CreateCompilation(source, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="11").VerifyDiagnostics() End Sub <Fact> Public Sub WriteOnlyVsReadOnlyProperty_01() Dim compilationDef = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C <OverloadResolutionPriority(1)> public Shared WriteOnly Property M(x As I1) As Integer Set System.Console.WriteLine(1) End Set End Property public Shared ReadOnly Property M(x As I2) As Integer Get throw DirectCast(Nothing, System.Exception) End Get End Property End Class public class Program Shared Sub Main Dim i3 As I3 = Nothing Dim x = C.M(i3) End Sub End Class " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) compilation.AssertTheseDiagnostics( <expected> BC30524: Property 'M' is 'WriteOnly'. Dim x = C.M(i3) ~~~~~~~ </expected>) End Sub <Fact> Public Sub WriteOnlyVsReadOnlyProperty_02() Dim compilationDef = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C public Shared WriteOnly Property M(x As I1) As Integer Set System.Console.WriteLine(1) End Set End Property <OverloadResolutionPriority(1)> public Shared ReadOnly Property M(x As I2) As Integer Get throw DirectCast(Nothing, System.Exception) End Get End Property End Class public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) = 0 End Sub End Class " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) compilation.AssertTheseDiagnostics( <expected> BC30526: Property 'M' is 'ReadOnly'. C.M(i3) = 0 ~~~~~~~~~~~ </expected>) End Sub <Fact> Public Sub LiftedOperator_01() Dim reference = " public Structure S <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> public shared operator-(x As S) As S System.Console.Write(1) return Nothing End Operator public shared operator-(x As S?) As S? System.Console.Write(2) return Nothing End Operator End Structure " Dim source = " Module Module1 Sub Main() Dim s As New S?(Nothing) s = -s End Sub End Module " Dim compilation = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:="1") compilation = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe, parseOptions:=TestOptions.Regular17_13) CompileAndVerify(compilation, expectedOutput:="1") compilation = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe, parseOptions:=TestOptions.Regular16_9) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16.9 does not support overload resolution priority. <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) Dim ref = CreateCompilation({reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseDll) compilation = CreateCompilation(source, references:={ref.ToMetadataReference()}, options:=TestOptions.ReleaseExe, parseOptions:=TestOptions.Regular16_9) CompileAndVerify(compilation, expectedOutput:="2") compilation = CreateCompilation(source, references:={ref.EmitToImageReference()}, options:=TestOptions.ReleaseExe, parseOptions:=TestOptions.Regular16_9) CompileAndVerify(compilation, expectedOutput:="2") End Sub <Fact> Public Sub Plus2() Dim compilationDef = " Option Strict Off Imports System Module Module1 Structure S1 <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Public Shared Operator +(x As S1) As S1 System.Console.WriteLine(""+(x As S1) As S1"") Return x End Operator <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> Public Shared Operator +(x As S1?) As Integer System.Console.WriteLine(""+(x As S1?) As Integer"") Return 0 End Operator End Structure Sub Main() Dim y1 = +New S1() System.Console.WriteLine(""-----"") Dim y2 = +New S1?() System.Console.WriteLine(""-----"") Dim y3 = +New S1?(New S1()) End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:= <![CDATA[ +(x As S1) As S1 ----- +(x As S1?) As Integer ----- +(x As S1?) As Integer ]]>) End Sub <Fact> Public Sub ConversionOperator_01() Dim compilationDef = " Structure S public shared widening operator CType(x As Integer) As S System.Console.Write(1) return Nothing End Operator <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> public shared widening operator CType(x As Long) As S System.Console.Write(2) return Nothing End Operator End Structure Module Module1 Sub Main() Dim val as Integer = 0 Dim s As S = val End Sub End Module " Dim compilation = CreateCompilation({compilationDef, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.ReleaseExe) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <System.Runtime.CompilerServices.OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Theory, CombinatorialData> Public Sub IncreasedPriorityWins_02_CS(i1First As Boolean) Dim reference = CreateCSharpCompilation(" using System.Runtime.CompilerServices; public interface I1 {} public interface I2 {} public interface I3 : I1, I2 {} public class C { [OverloadResolutionPriority(2)] public static void M(object o) => System.Console.WriteLine(1); [OverloadResolutionPriority(1)] public static void M(I1 x) => throw null; public static void M(I2 x) => throw null; } " + OverloadResolutionPriorityAttributeDefinitionCS, parseOptions:=New CSharpParseOptions(CSharp.LanguageVersion.Latest)).EmitToImageReference() Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) End Sub End Class " Dim compilation = CreateCompilation(source, references:={reference}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub IncreasedPriorityWins_02() Dim reference = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C <OverloadResolutionPriority(2)> public Shared Sub M(x As Object) System.Console.WriteLine(1) End Sub <OverloadResolutionPriority(1)> public Shared Sub M(x As I1) throw DirectCast(Nothing, System.Exception) End Sub public Shared Sub M(x As I2) throw DirectCast(Nothing, System.Exception) End Sub End Class " Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp1, expectedOutput:="1").VerifyDiagnostics() Dim comp2 = CreateCompilation(source, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="1").VerifyDiagnostics() Dim comp3 = CreateCompilation(source, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="1").VerifyDiagnostics() End Sub <Theory, CombinatorialData> Public Sub DecreasedPriorityLoses(i1First As Boolean) Dim i1Source = " public Shared Sub M(x As I1) System.Console.WriteLine(1) End Sub " Dim i2Source = " <OverloadResolutionPriority(-1)> public Shared Sub M(x As I2) throw DirectCast(Nothing, System.Exception) End Sub " Dim reference = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C" + If(i1First, i1Source, i2Source) + If(i1First, i2Source, i1Source) + " End Class " Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp1, expectedOutput:="1").VerifyDiagnostics() Dim comp2 = CreateCompilation(source, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="1").VerifyDiagnostics() Dim comp3 = CreateCompilation(source, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub ZeroIsTreatedAsDefault() Dim reference = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C public Shared Sub M(x As I1) System.Console.WriteLine(1) End Sub <OverloadResolutionPriority(0)> public Shared Sub M(x As I2) throw DirectCast(Nothing, System.Exception) End Sub End Class " Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) Dim expected = <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared Sub M(x As I1)': Not most specific. 'Public Shared Sub M(x As I2)': Not most specific. C.M(i3) ~ </expected> comp1.AssertTheseDiagnostics(expected) comp1 = CreateCompilation({reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) Dim validate = Sub([module] As ModuleSymbol) Dim c = [module].ContainingAssembly.GetTypeByMetadataName("C") Dim ms = c.GetMembers("M").Cast(Of MethodSymbol)() For Each m In ms Assert.Equal(0, m.OverloadResolutionPriority) Next End Sub CompileAndVerify(comp1, sourceSymbolValidator:=validate, symbolValidator:=validate).VerifyDiagnostics() Dim comp2 = CreateCompilation(source, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) comp2.AssertTheseDiagnostics(expected) Dim comp3 = CreateCompilation(source, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) comp3.AssertTheseDiagnostics(expected) End Sub <Theory> <InlineData(-1)> <InlineData(1)> <InlineData(Integer.MaxValue)> <InlineData(Integer.MinValue)> Public Sub AmbiguityWithinPriority(priority As Integer) Dim reference = $" Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C <OverloadResolutionPriority({priority})> public Shared Sub M(x As I1) System.Console.WriteLine(1) End Sub <OverloadResolutionPriority({priority})> public Shared Sub M(x As I2) throw DirectCast(Nothing, System.Exception) End Sub End Class " Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing C.M(i3) End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) Dim expected = <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared Sub M(x As I1)': Not most specific. 'Public Shared Sub M(x As I2)': Not most specific. C.M(i3) ~ </expected> comp1.AssertTheseDiagnostics(expected) End Sub <Fact> Public Sub MethodDiscoveryStopsAtFirstApplicableMethod_CS() Dim reference = CreateCSharpCompilation(" using System.Runtime.CompilerServices; public interface I1 {} public interface I2 {} public interface I3 : I1, I2 {} public class Base { [OverloadResolutionPriority(1)] public static void M(I2 x) => throw null; } public class Derived : Base { public static void M(I1 x) => System.Console.WriteLine(1); } " + OverloadResolutionPriorityAttributeDefinitionCS, parseOptions:=New CSharpParseOptions(CSharp.LanguageVersion.Latest)).EmitToImageReference() Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing Derived.M(i3) End Sub End Class " Dim compilation = CreateCompilation(source, references:={reference}, options:=TestOptions.DebugExe) ' Unlike C#, VB doesn't stop collecting candidates at Derived compilation.AssertTheseDiagnostics( <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: 'Public Shared Overloads Sub Derived.M(x As I1)': Not most specific. 'Public Shared Overloads Sub Base.M(x As I2)': Not most specific. Derived.M(i3) ~ </expected>) End Sub <Fact> Public Sub MethodDiscoveryStopsAtFirstApplicableIndexer_CS() Dim reference = CreateCSharpCompilation(" using System.Runtime.CompilerServices; public interface I1 {} public interface I2 {} public interface I3 : I1, I2 {} public class Base { [OverloadResolutionPriority(1)] public int this[I2 x] { get => throw null; set => throw null; } } public class Derived : Base { public int this[I1 x] { get { System.Console.Write(1); return 1; } set => System.Console.Write(2); } } " + OverloadResolutionPriorityAttributeDefinitionCS, parseOptions:=New CSharpParseOptions(CSharp.LanguageVersion.Latest)).EmitToImageReference() Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing Dim d = new Derived() Dim x = d(i3) d(i3) = 0 End Sub End Class " Dim compilation = CreateCompilation(source, references:={reference}, options:=TestOptions.DebugExe) ' Unlike C#, VB doesn't stop collecting candidates at Derived compilation.AssertTheseDiagnostics( <expected> BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Overloads Default Property Derived.Item(x As I1) As Integer': Not most specific. 'Public Overloads Default Property Base.Item(x As I2) As Integer': Not most specific. Dim x = d(i3) ~ BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Overloads Default Property Derived.Item(x As I1) As Integer': Not most specific. 'Public Overloads Default Property Base.Item(x As I2) As Integer': Not most specific. d(i3) = 0 ~ </expected>) End Sub <Fact> Public Sub OrderingWithAnExtensionMethodContainingClass_CS() Dim reference = CreateCSharpCompilation(" using System.Runtime.CompilerServices; public interface I1 {} public interface I2 {} public interface I3 : I1, I2 {} public static class C { [OverloadResolutionPriority(1)] public static void M(this I1 x) => System.Console.WriteLine(1); public static void M(this I2 x) => throw null; } " + OverloadResolutionPriorityAttributeDefinitionCS, parseOptions:=New CSharpParseOptions(CSharp.LanguageVersion.Latest)).EmitToImageReference() Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing i3.M() End Sub End Class " Dim compilation = CreateCompilation(source, references:={reference}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub DoesNotOrderBetweenExtensionMethodContainingClasses_CS() Dim reference = CreateCSharpCompilation(" using System.Runtime.CompilerServices; public interface I1 {} public interface I2 {} public interface I3 : I1, I2 {} public static class C1 { [OverloadResolutionPriority(1)] public static void M(this I1 x) => System.Console.WriteLine(1); } public static class C2 { public static void M(this I2 x) => throw null; } " + OverloadResolutionPriorityAttributeDefinitionCS, parseOptions:=New CSharpParseOptions(CSharp.LanguageVersion.Latest)).EmitToImageReference() Dim source = " public class Program Shared Sub Main Dim i3 As I3 = Nothing i3.M() End Sub End Class " Dim compilation = CreateCompilation(source, references:={reference}, options:=TestOptions.DebugExe) compilation.AssertTheseDiagnostics( <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: Extension method 'Public Sub M()' defined in 'C1': Not most specific. Extension method 'Public Sub M()' defined in 'C2': Not most specific. i3.M() ~ </expected>) End Sub <Fact> Public Sub Overrides_NoPriorityChangeFromBase_Methods_CS() Dim reference = CreateCSharpCompilation(" using System.Runtime.CompilerServices; public class Base { [OverloadResolutionPriority(1)] public virtual void M(object o) => throw null; public virtual void M(string s) => throw null; } public class Derived : Base { public override void M(object o) => System.Console.WriteLine(""1""); public override void M(string s) => throw null; } " + OverloadResolutionPriorityAttributeDefinitionCS, parseOptions:=New CSharpParseOptions(CSharp.LanguageVersion.Latest)).EmitToImageReference() Dim source = " public class Program Shared Sub Main Dim d = new Derived() d.M(""test"") End Sub End Class " Dim compilation = CreateCompilation(source, references:={reference}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub Overrides_ChangePriorityInSource_Methods() Dim source = " Imports System.Runtime.CompilerServices public class Base <OverloadResolutionPriority(1)> public Overridable Sub M(o As Object) throw DirectCast(Nothing, System.Exception) End Sub public Overridable Sub M(s As String) throw DirectCast(Nothing, System.Exception) End Sub <OverloadResolutionPriority(3)> public Overridable Sub M2(o As Object) throw DirectCast(Nothing, System.Exception) End Sub End Class public class Derived Inherits Base <OverloadResolutionPriority(0)> public Overrides Sub M(o As Object) System.Console.WriteLine(""1"") End Sub <OverloadResolutionPriority(2)> public Overrides Sub M(s As String) throw DirectCast(Nothing, System.Exception) End Sub <OverloadResolutionPriority(3)> ' Priority matches public Overrides Sub M2(o As Object) System.Console.WriteLine(""1"") End Sub End Class public class Program Shared Sub Main Dim d = new Derived() d.M(""test"") End Sub End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC37333: Cannot use 'OverloadResolutionPriorityAttribute' on an overriding member. <OverloadResolutionPriority(0)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37333: Cannot use 'OverloadResolutionPriorityAttribute' on an overriding member. <OverloadResolutionPriority(2)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37333: Cannot use 'OverloadResolutionPriorityAttribute' on an overriding member. <OverloadResolutionPriority(3)> ' Priority matches ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact> Public Sub Overrides_ChangePriorityInMetadata_Methods() Dim source1 = " Imports System.Runtime.CompilerServices public class Base <OverloadResolutionPriority(1)> public Overridable Sub M(o As Object) throw DirectCast(Nothing, System.Exception) End Sub public Overridable Sub M(s As String) throw DirectCast(Nothing, System.Exception) End Sub End Class " Dim comp1 = CreateCompilation({source1, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll, assemblyName:="assembly1") Dim assembly1 = comp1.EmitToImageReference() ' Equivalent to: ' ' public class Derived : Base ' { ' [OverloadResolutionPriority(0)] ' public override void M(object o) => System.Console.WriteLine("1"); ' [OverloadResolutionPriority(2)] ' public override void M(string s) => throw null; ' } Dim il2 = " .assembly extern assembly1 {} .class public auto ansi beforefieldinit Derived extends [assembly1]Base { .method public hidebysig virtual instance void M ( object o ) cil managed { .custom instance void [assembly1]System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 ) ldstr ""1"" call void [mscorlib]System.Console::WriteLine(string) ret } // end of method Derived::M .method public hidebysig virtual instance void M ( string s ) cil managed { .custom instance void [assembly1]System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 ) ldnull throw } // end of method Derived::M .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { ldarg.0 call instance void [assembly1]Base::.ctor() ret } // end of method Derived::.ctor } " Dim source = " public class Program Shared Sub Main Dim d = new Derived() d.M(""test"") End Sub End Class " Dim assembly2 = CompileIL(il2) Dim compilation = CreateCompilation(source, references:={assembly1, assembly2}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub Overrides_ChangePriorityInMetadata_Indexers() Dim source1 = " Imports System.Runtime.CompilerServices public class Base <OverloadResolutionPriority(1)> public Overridable Default Property Item(o As Object) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property public Overridable Default Property Item(s As String) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property End Class " Dim comp1 = CreateCompilation({source1, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll, assemblyName:="assembly1") Dim assembly1 = comp1.EmitToImageReference() ' Equivalent to: ' ' public class Derived: Base ' { ' public override int this[object o] ' { ' get { System.Console.Write(1); return 1; } ' set => System.Console.Write(2); ' } ' [OverloadResolutionPriority(2)] ' public override int this[string s] ' { ' get => throw null; ' set => throw null; ' } ' } Dim il2 = " .assembly extern assembly1 {} .class public auto ansi beforefieldinit Derived extends [assembly1]Base { .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6d 00 00 ) // Methods .method public hidebysig specialname virtual instance int32 get_Item ( object o ) cil managed { ldc.i4.1 call void [mscorlib]System.Console::Write(int32) ldc.i4.1 ret } // end of method Derived::get_Item .method public hidebysig specialname virtual instance void set_Item ( object o, int32 'value' ) cil managed { ldc.i4.2 call void [mscorlib]System.Console::Write(int32) ret } // end of method Derived::set_Item .method public hidebysig specialname virtual instance int32 get_Item ( string s ) cil managed { ldnull throw } // end of method Derived::get_Item .method public hidebysig specialname virtual instance void set_Item ( string s, int32 'value' ) cil managed { ldnull throw } // end of method Derived::set_Item .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { ldarg.0 call instance void [assembly1]Base::.ctor() ret } // end of method Derived::.ctor // Properties .property instance int32 Item( object o ) { .get instance int32 Derived::get_Item(object) .set instance void Derived::set_Item(object, int32) } .property instance int32 Item( string s ) { .custom instance void [assembly1]System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 ) .get instance int32 Derived::get_Item(string) .set instance void Derived::set_Item(string, int32) } } " Dim source = " public class Program Shared Sub Main Dim d = new Derived() Dim x = d(""test"") d(""test"") = 0 x = d.Item(""test"") d.Item(""test"") = 0 End Sub End Class " Dim assembly2 = CompileIL(il2) Dim compilation = CreateCompilation(source, references:={assembly1, assembly2}, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="1212").VerifyDiagnostics() End Sub <Fact> Public Sub Overrides_ChangePriorityInSource_Indexers() Dim source = " Imports System.Runtime.CompilerServices public class Base <OverloadResolutionPriority(1)> public Overridable Default Property Item(o As Object) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property public Overridable Default Property Item(s As String) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property <OverloadResolutionPriority(3)> public Overridable Default Property Item(o As Integer) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property End Class public class Derived Inherits Base public Overrides Default Property Item(o As Object) As Integer Get System.Console.Write(1) return 1 End Get Set System.Console.Write(2) End Set End Property <OverloadResolutionPriority(2)> public Overrides Default Property Item(s As String) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property <OverloadResolutionPriority(3)> ' Priority matches public Overrides Default Property Item(o As Integer) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property End Class public class Program Shared Sub Main Dim d = new Derived() Dim x = d(""test"") d(""test"") = 0 x = d.Item(""test"") d.Item(""test"") = 0 End Sub End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC37333: Cannot use 'OverloadResolutionPriorityAttribute' on an overriding member. <OverloadResolutionPriority(2)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37333: Cannot use 'OverloadResolutionPriorityAttribute' on an overriding member. <OverloadResolutionPriority(3)> ' Priority matches ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact> Public Sub ThroughRetargeting_Methods() Dim source1 = " public class RetValue End Class " Dim comp1_1 = CreateCompilation(source1, options:=TestOptions.DebugDll, assemblyName:="Ret") DirectCast(comp1_1.Assembly, SourceAssemblySymbol).m_lazyIdentity = New AssemblyIdentity("Ret", New Version(1, 0, 0, 0), isRetargetable:=True) Dim comp1_2 = CreateCompilation(source1, options:=TestOptions.DebugDll, assemblyName:="Ret") DirectCast(comp1_2.Assembly, SourceAssemblySymbol).m_lazyIdentity = New AssemblyIdentity("Ret", New Version(2, 0, 0, 0), isRetargetable:=True) Dim source2 = " Imports System.Runtime.CompilerServices public class C <OverloadResolutionPriority(1)> public Function M(o As Object) As RetValue System.Console.WriteLine(""1"") return new RetValue() End Function public Function M(s As String) throw DirectCast(Nothing, System.Exception) End Function End Class " Dim comp2 = CreateCompilation({source2, OverloadResolutionPriorityAttributeDefinitionVB}, references:={comp1_1.ToMetadataReference()}, options:=TestOptions.DebugDll) comp2.VerifyDiagnostics() Dim source3 = " public class Program Shared Sub Main Dim c = new C() c.M(""test"") End Sub End Class " Dim comp3 = CreateCompilation(source3, references:={comp2.ToMetadataReference(), comp1_2.ToMetadataReference()}, options:=TestOptions.DebugExe) Dim c = comp3.GetTypeByMetadataName("C") Dim ms = c.GetMembers("M").Cast(Of MethodSymbol)().ToArray() Assert.Equal(2, ms.Length) Assert.All(ms, Function(m) Assert.IsType(Of RetargetingMethodSymbol)(m)) AssertEx.Equal("Function C.M(o As System.Object) As RetValue", ms(0).ToTestDisplayString()) Assert.Equal(1, ms(0).OverloadResolutionPriority) AssertEx.Equal("Function C.M(s As System.String) As System.Object", ms(1).ToTestDisplayString()) Assert.Equal(0, ms(1).OverloadResolutionPriority) comp3.VerifyDiagnostics() End Sub <Fact> Public Sub ThroughRetargeting_Indexers() Dim source1 = " public class RetValue End Class " Dim comp1_1 = CreateCompilation(source1, options:=TestOptions.DebugDll, assemblyName:="Ret") DirectCast(comp1_1.Assembly, SourceAssemblySymbol).m_lazyIdentity = New AssemblyIdentity("Ret", New Version(1, 0, 0, 0), isRetargetable:=True) Dim comp1_2 = CreateCompilation(source1, options:=TestOptions.DebugDll, assemblyName:="Ret") DirectCast(comp1_2.Assembly, SourceAssemblySymbol).m_lazyIdentity = New AssemblyIdentity("Ret", New Version(2, 0, 0, 0), isRetargetable:=True) Dim source2 = " Imports System.Runtime.CompilerServices public class C <OverloadResolutionPriority(1)> public Default Property M(o As Object) As RetValue Get System.Console.WriteLine(""1"") return new RetValue() End Get Set System.Console.WriteLine(""2"") End Set End Property public Default Property M(s As String) Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property End Class " Dim comp2 = CreateCompilation({source2, OverloadResolutionPriorityAttributeDefinitionVB}, references:={comp1_1.ToMetadataReference()}, options:=TestOptions.DebugDll) comp2.VerifyDiagnostics() Dim source3 = " public class Program Shared Sub Main Dim c = new C() Dim x = c(""test"") c(""test"") = new RetValue() End Sub End Class " Dim comp3 = CreateCompilation(source3, references:={comp2.ToMetadataReference(), comp1_2.ToMetadataReference()}, options:=TestOptions.DebugExe) Dim c = comp3.GetTypeByMetadataName("C") Dim ms = c.GetMembers("M").Cast(Of PropertySymbol)().ToArray() Assert.Equal(2, ms.Length) Assert.All(ms, Function(m) Assert.IsType(Of RetargetingPropertySymbol)(m)) AssertEx.Equal("Property C.M(o As System.Object) As RetValue", ms(0).ToTestDisplayString()) Assert.Equal(1, ms(0).OverloadResolutionPriority) AssertEx.Equal("Property C.M(s As System.String) As System.Object", ms(1).ToTestDisplayString()) Assert.Equal(0, ms(1).OverloadResolutionPriority) comp3.VerifyDiagnostics() End Sub <Fact> Public Sub AppliedToAttributeConstructors() Dim source = " Imports System.Runtime.CompilerServices <C(""test"")> public class C Inherits System.Attribute <OverloadResolutionPriority(1)> public Sub New(o As object) End Sub public Sub New(s As string) End Sub End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) CompileAndVerify(compilation).VerifyDiagnostics() Dim c = compilation.GetTypeByMetadataName("C") Dim attr = c.GetAttributes().Single() AssertEx.Equal("Sub C..ctor(o As System.Object)", attr.AttributeConstructor.ToTestDisplayString()) End Sub <Fact> Public Sub CycleOnOverloadResolutionPriorityConstructor_01() Dim source = " namespace System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.Method Or AttributeTargets.Constructor Or AttributeTargets.Property, AllowMultiple:= false, Inherited:= false)> public class OverloadResolutionPriorityAttribute Inherits Attribute <OverloadResolutionPriority(1)> Public Sub New(priority As Integer) Me.Priority = priority End Sub public Readonly Property Priority As Integer End Class End Namespace " Dim compilation = CreateCompilation(source, options:=TestOptions.DebugDll) CompileAndVerify(compilation).VerifyDiagnostics() End Sub <Theory> <InlineData(0)> <InlineData(1)> Public Sub CycleOnOverloadResolutionPriorityConstructor_02(ctorToForce As Integer) Dim source = " Imports System.Runtime.CompilerServices namespace System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.Method Or AttributeTargets.Constructor Or AttributeTargets.Property, AllowMultiple:= false, Inherited:= false)> public class OverloadResolutionPriorityAttribute Inherits Attribute Public Sub New(priority As Integer) Me.Priority = priority End Sub ' Attribute is intentionally ignored, as this will cause a cycle <OverloadResolutionPriority(1)> Public Sub New(priority As Object) Me.Priority = priority End Sub public Readonly Property Priority As Integer End Class End Namespace public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public Module Program <OverloadResolutionPriority(1)> <Extension> Sub M(this As I1) System.Console.WriteLine(1) End Sub <Extension> Sub M(this As I2) throw DirectCast(Nothing, System.Exception) End Sub Sub Main Dim i3 As I3 = Nothing i3.M() End Sub End Module " Dim compilation = CreateCompilation(source, options:=TestOptions.DebugExe) compilation.AssertTheseEmitDiagnostics( <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: Extension method 'Public Sub M()' defined in 'Program': Not most specific. Extension method 'Public Sub M()' defined in 'Program': Not most specific. i3.M() ~ </expected> ) compilation = CreateCompilation(source, options:=TestOptions.DebugExe) Dim ctors = compilation.GetTypeByMetadataName("System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute").Constructors Dim ctor = ctors(1) AssertEx.Equal("Sub System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute..ctor(priority As System.Object)", ctor.ToTestDisplayString()) ctors(ctorToForce).GetAttributes() compilation.AssertTheseEmitDiagnostics( <expected> BC30521: Overload resolution failed because no accessible 'M' is most specific for these arguments: Extension method 'Public Sub M()' defined in 'Program': Not most specific. Extension method 'Public Sub M()' defined in 'Program': Not most specific. i3.M() ~ </expected> ) Assert.Equal(1, ctor.OverloadResolutionPriority) AssertEx.Equal("Sub System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute..ctor(priority As System.Int32)", ctor.GetAttributes().Single().AttributeConstructor.ToTestDisplayString()) Dim m = compilation.GetTypeByMetadataName("Program").GetMembers("M").OfType(Of MethodSymbol)().First() Assert.Equal(0, m.OverloadResolutionPriority) AssertEx.Equal("Sub System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute..ctor(priority As System.Object)", m.GetAttributes().First().AttributeConstructor.ToTestDisplayString()) End Sub <Fact> Public Sub CycleOnOverloadResolutionPriorityConstructor_04() Dim source = " Imports System.Runtime.CompilerServices namespace System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.Method Or AttributeTargets.Constructor Or AttributeTargets.Property, AllowMultiple:= false, Inherited:= false)> public class OverloadResolutionPriorityAttribute Inherits Attribute <OtherAttribute()> Public Sub New(priority As Integer) Me.Priority = priority End Sub public Readonly Property Priority As Integer End Class End Namespace public class OtherAttribute Inherits System.Attribute <OverloadResolutionPriority(1)> Public Sub New() End Sub End Class " Dim compilation = CreateCompilation(source, options:=TestOptions.DebugDll) CompileAndVerify(compilation).VerifyDiagnostics() End Sub <Fact> Public Sub CycleOnOverloadResolutionPriorityConstructor_05() Dim source = " Imports System.Runtime.CompilerServices namespace System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.Method Or AttributeTargets.Constructor Or AttributeTargets.Property, AllowMultiple:= false, Inherited:= false)> public class OverloadResolutionPriorityAttribute Inherits Attribute <ObsoleteAttribute()> Public Sub New(priority As Integer) Me.Priority = priority End Sub public Readonly Property Priority As Integer End Class End Namespace Namespace System public class ObsoleteAttribute Inherits System.Attribute <OverloadResolutionPriority(1)> Public Sub New() End Sub End Class End Namespace " Dim compilation = CreateCompilation(source, options:=TestOptions.DebugDll) CompileAndVerify(compilation).Diagnostics.AssertTheseDiagnostics( <expected><![CDATA[ BC40008: 'Public Sub New(priority As Integer)' is obsolete. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected> ) End Sub <Theory> <InlineData(0)> <InlineData(1)> Public Sub CycleOnOverloadResolutionPriorityConstructor_06(ctorToForce As Integer) Dim source = " Imports System.Runtime.CompilerServices namespace System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.Method Or AttributeTargets.Constructor Or AttributeTargets.Property, AllowMultiple:= false, Inherited:= false)> public class OverloadResolutionPriorityAttribute Inherits Attribute Public Sub New(priority As Integer) Me.Priority = priority End Sub ' Attribute is intentionally ignored, as this will cause a cycle <OverloadResolutionPriority(CType(-1, SByte))> Public Sub New(priority As SByte) Me.Priority = priority End Sub public Readonly Property Priority As Integer End Class End Namespace public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public Module Program <OverloadResolutionPriority(1)> <Extension> Sub M(this As I1) System.Console.WriteLine(1) End Sub <Extension> Sub M(this As I2) throw DirectCast(Nothing, System.Exception) End Sub Sub Main Dim i3 As I3 = Nothing i3.M() End Sub End Module " Dim compilation = CreateCompilation(source, options:=TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() compilation = CreateCompilation(source, options:=TestOptions.DebugExe) Dim ctors = compilation.GetTypeByMetadataName("System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute").Constructors Dim ctor = ctors(1) AssertEx.Equal("Sub System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute..ctor(priority As System.SByte)", ctor.ToTestDisplayString()) ctors(ctorToForce).GetAttributes() CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() Assert.Equal(0, ctor.OverloadResolutionPriority) AssertEx.Equal("Sub System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute..ctor(priority As System.SByte)", ctor.GetAttributes().Single().AttributeConstructor.ToTestDisplayString()) Dim m = compilation.GetTypeByMetadataName("Program").GetMembers("M").OfType(Of MethodSymbol)().First() Assert.Equal(1, m.OverloadResolutionPriority) AssertEx.Equal("Sub System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute..ctor(priority As System.Int32)", m.GetAttributes().First().AttributeConstructor.ToTestDisplayString()) End Sub <Fact> Public Sub CycleOnOverloadResolutionPriorityConstructor_07() Dim source = " Imports System.Runtime.CompilerServices Namespace System public class ObsoleteAttribute Inherits System.Attribute Public Sub New(x As String) End Sub <OverloadResolutionPriority(1)> Public Sub New(x As String, Optional y As Boolean = False) End Sub End Class End Namespace <System.Obsolete(""Test"")> Class C End Class Class D Dim x As C End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) Dim verifier = CompileAndVerify( compilation, symbolValidator:=Sub(m) AssertEx.Equal("Sub System.ObsoleteAttribute..ctor(x As System.String, [y As System.Boolean = False])", m.ContainingAssembly.GetTypeByMetadataName("C").GetAttributes.Single().AttributeConstructor.ToTestDisplayString()) End Sub) verifier.Diagnostics.AssertTheseDiagnostics( <expected><![CDATA[ BC40000: 'C' is obsolete: 'Test'. Dim x As C ~ ]]></expected> ) End Sub <Fact> Public Sub CycleOnOverloadResolutionPriorityConstructor_08() Dim source = " Imports System.Runtime.CompilerServices Namespace System public class ObsoleteAttribute Inherits System.Attribute Public Sub New(x As String) End Sub <OverloadResolutionPriority(1)> Public Sub New(x As String, Optional y As Boolean = True) End Sub End Class End Namespace <System.Obsolete(""Test"")> Class C End Class Class D Dim x As C End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) AssertEx.Equal("Sub System.ObsoleteAttribute..ctor(x As System.String, [y As System.Boolean = True])", compilation.GetTypeByMetadataName("C").GetAttributes.Single().AttributeConstructor.ToTestDisplayString()) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC30668: 'C' is obsolete: 'Test'. Dim x As C ~ ]]></expected> ) End Sub <Theory, CombinatorialData> Public Sub OverloadResolutionAppliedToIndexers(i1First As Boolean) Dim i1Source = " <OverloadResolutionPriority(1)> public Default Property Item(x As I1) As Integer Get System.Console.Write(1) Return 0 End Get Set System.Console.Write(2) End Set End Property " Dim i2Source = " public Default Property Item(x As I2) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property " Dim reference = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface public class C" + If(i1First, i1Source, i2Source) + If(i1First, i2Source, i1Source) + " End Class " Dim source = " public class Program Shared Sub Main Dim c = new C() Dim i3 As I3 = Nothing Dim x = c(i3) c(i3) = 0 End Sub End Class " Dim comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) Dim validate = Sub([module] As ModuleSymbol) Dim c = [module].ContainingAssembly.GetTypeByMetadataName("C") Dim ms = c.GetMembers("Item").Cast(Of PropertySymbol)() For Each m In ms Assert.Equal(If(m.Parameters(0).Type.Name = "I1", 1, 0), m.OverloadResolutionPriority) Next End Sub CompileAndVerify(comp1, expectedOutput:="12", sourceSymbolValidator:=validate, symbolValidator:=validate).VerifyDiagnostics() Dim compilationReference As CompilationReference = comp1.ToMetadataReference() Dim comp2 = CreateCompilation(source, references:={compilationReference}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="12").VerifyDiagnostics() Dim metadataReference As MetadataReference = comp1.EmitToImageReference() Dim comp3 = CreateCompilation(source, references:={metadataReference}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="12").VerifyDiagnostics() comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular17_13) CompileAndVerify(comp1, expectedOutput:="12", sourceSymbolValidator:=validate, symbolValidator:=validate).VerifyDiagnostics() comp1 = CreateCompilation({source, reference, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) comp1.AssertTheseDiagnostics(If(i1First, <expected><![CDATA[ BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Default Property Item(x As I1) As Integer': Not most specific. 'Public Default Property Item(x As I2) As Integer': Not most specific. Dim x = c(i3) ~ BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Default Property Item(x As I1) As Integer': Not most specific. 'Public Default Property Item(x As I2) As Integer': Not most specific. c(i3) = 0 ~ BC36716: Visual Basic 16.9 does not support overload resolution priority. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>, <expected><![CDATA[ BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Default Property Item(x As I2) As Integer': Not most specific. 'Public Default Property Item(x As I1) As Integer': Not most specific. Dim x = c(i3) ~ BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Default Property Item(x As I2) As Integer': Not most specific. 'Public Default Property Item(x As I1) As Integer': Not most specific. c(i3) = 0 ~ BC36716: Visual Basic 16.9 does not support overload resolution priority. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>)) comp2 = CreateCompilation(source, references:={compilationReference}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) Dim expected = If(i1First, <expected> BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Default Property Item(x As I1) As Integer': Not most specific. 'Public Default Property Item(x As I2) As Integer': Not most specific. Dim x = c(i3) ~ BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Default Property Item(x As I1) As Integer': Not most specific. 'Public Default Property Item(x As I2) As Integer': Not most specific. c(i3) = 0 ~ </expected>, <expected> BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Default Property Item(x As I2) As Integer': Not most specific. 'Public Default Property Item(x As I1) As Integer': Not most specific. Dim x = c(i3) ~ BC30521: Overload resolution failed because no accessible 'Item' is most specific for these arguments: 'Public Default Property Item(x As I2) As Integer': Not most specific. 'Public Default Property Item(x As I1) As Integer': Not most specific. c(i3) = 0 ~ </expected>) comp2.AssertTheseDiagnostics(expected) comp3 = CreateCompilation(source, references:={metadataReference}, options:=TestOptions.DebugExe, parseOptions:=TestOptions.Regular16_9) comp3.AssertTheseDiagnostics(expected) End Sub <Fact> Public Sub NoImpactToFunctionType() Dim source = " Option Infer On Imports System.Runtime.CompilerServices Class C Shared Sub Main() Dim x = AddressOf M1 End Sub <OverloadResolutionPriority(1)> Shared Sub M1(x As Integer) End Sub Shared Sub M1(x As String) End Sub End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC30581: 'AddressOf' expression cannot be converted to 'Object' because 'Object' is not a delegate type. Dim x = AddressOf M1 ~~~~~~~~~~~~ ]]></expected> ) End Sub <Fact> Public Sub DelegateConversion() Dim source1 = " Imports System.Runtime.CompilerServices Public Class C <OverloadResolutionPriority(1)> Shared Sub M(x As Object) System.Console.Write(1) End Sub Shared Sub M(x As String) throw DirectCast(Nothing, System.Exception) End Sub End Class " Dim source2 = " Module Program Sub Main() Dim a As System.Action(Of string) = AddressOf C.M a(Nothing) End Sub End Module " Dim comp1 = CreateCompilation({source1, source2, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp1, expectedOutput:="1").VerifyDiagnostics() Dim comp2 = CreateCompilation(source2, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="1").VerifyDiagnostics() Dim comp3 = CreateCompilation(source2, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub Interface_DifferentPriorities_Methods() Dim source1 = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface Public Interface I <OverloadResolutionPriority(1)> Sub M(x As I1) Sub M(x As I2) End Interface Public Class C Implements I public Sub M(x As I1) Implements I.M System.Console.Write(1) End Sub <OverloadResolutionPriority(2)> public Sub M(x As I2) Implements I.M System.Console.Write(2) End Sub End Class " Dim source2 = " Module Program Sub Main() Dim c = new C() Dim i3 As I3 = Nothing c.M(i3) DirectCast(c, I).M(i3) End Sub End Module " Dim comp1 = CreateCompilation({source1, source2, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp1, expectedOutput:="21").VerifyDiagnostics() Dim comp2 = CreateCompilation(source2, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="21").VerifyDiagnostics() Dim comp3 = CreateCompilation(source2, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="21").VerifyDiagnostics() End Sub <Fact> Public Sub Interface_DifferentPriorities_Indexers() Dim source1 = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface Public Interface I <OverloadResolutionPriority(1)> Default Property Item(x As I1) As Integer Default Property Item(x As I2) As Integer End Interface Public Class C Implements I Default Property Item(x As I1) As Integer Implements I.Item Get System.Console.Write(1) return 0 End Get Set System.Console.Write(2) End Set End Property <OverloadResolutionPriority(2)> Default Property Item(x As I2) As Integer Implements I.Item Get System.Console.Write(3) return 0 End Get Set System.Console.Write(4) End Set End Property End Class " Dim source2 = " Module Program Sub Main() Dim c = new C() Dim i3 As I3 = Nothing c(I3) = 1 Dim x = c(i3) c.Item(I3) = 1 x = c.Item(i3) Dim i As I = DirectCast(c, I) i(I3) = 1 x = i(i3) i.Item(I3) = 1 x = i.Item(i3) End Sub End Module " Dim comp1 = CreateCompilation({source1, source2, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp1, expectedOutput:="43432121").VerifyDiagnostics() Dim comp2 = CreateCompilation(source2, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="43432121").VerifyDiagnostics() Dim comp3 = CreateCompilation(source2, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="43432121").VerifyDiagnostics() End Sub <Fact> Public Sub AppliedToIndexerGetterSetter_Source() Dim source = " Imports System.Runtime.CompilerServices Public Class C Default Property Item(x As Integer) As Integer <OverloadResolutionPriority(1)> Get throw DirectCast(Nothing, System.Exception) End Get <OverloadResolutionPriority(2)> Set throw DirectCast(Nothing, System.Exception) End Set End Property End Class " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) Dim c = comp.GetTypeByMetadataName("C") Dim indexer = c.GetMember(Of PropertySymbol)("Item") Assert.Equal(0, indexer.OverloadResolutionPriority) Assert.Equal(0, indexer.GetMethod.OverloadResolutionPriority) Assert.Equal(0, indexer.SetMethod.OverloadResolutionPriority) comp.AssertTheseDiagnostics( <expected><![CDATA[ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <OverloadResolutionPriority(2)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact> Public Sub AppliedToIndexerGetterSetter_Metadata() ' Equivalent to: ' public class C ' { ' public int this[object x] ' { ' [System.Runtime.CompilerServices.OverloadResolutionPriority(1)] ' get => throw null; ' [System.Runtime.CompilerServices.OverloadResolutionPriority(1)] ' set => throw null; ' } ' public int this[string x] ' { ' get { System.Console.Write(1); return 1; } ' set => System.Console.Write(2); ' } ' } Dim il = " .class public auto ansi beforefieldinit C extends [mscorlib]System.Object { .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6d 00 00 ) // Methods .method public hidebysig specialname instance int32 get_Item ( object x ) cil managed { .custom instance void System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) ldnull throw } // end of method C::get_Item .method public hidebysig specialname instance void set_Item ( object x, int32 'value' ) cil managed { .custom instance void System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) ldnull throw } // end of method C::set_Item .method public hidebysig specialname instance int32 get_Item ( string x ) cil managed { ldc.i4.1 call void [mscorlib]System.Console::Write(int32) ldc.i4.1 ret } // end of method C::get_Item .method public hidebysig specialname instance void set_Item ( string x, int32 'value' ) cil managed { ldc.i4.2 call void [mscorlib]System.Console::Write(int32) ret } // end of method C::set_Item .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } // end of method C::.ctor // Properties .property instance int32 Item( object x ) { .get instance int32 C::get_Item(object) .set instance void C::set_Item(object, int32) } .property instance int32 Item( string x ) { .get instance int32 C::get_Item(string) .set instance void C::set_Item(string, int32) } } " Dim ilRef = CompileIL(il + OverloadResolutionPriorityAttributeILDefinition) Dim source = " public class Program Shared Sub Main Dim c = new C() Dim x = c(""test"") c(""test"") = 0 End Sub End Class " Dim comp = CreateCompilation(source, references:={ilRef}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="12").VerifyDiagnostics() Dim c = comp.GetTypeByMetadataName("C") Dim indexers = c.GetMembers("Item").OfType(Of PropertySymbol)().ToArray() Assert.Equal(2, indexers.Length) Dim indexer = indexers(0) AssertEx.Equal("Property C.Item(x As System.Object) As System.Int32", indexer.ToTestDisplayString()) Assert.Equal(0, indexer.OverloadResolutionPriority) Assert.Equal(0, indexer.GetMethod.OverloadResolutionPriority) Assert.Equal(0, indexer.SetMethod.OverloadResolutionPriority) indexer = indexers(1) AssertEx.Equal("Property C.Item(x As System.String) As System.Int32", indexer.ToTestDisplayString()) Assert.Equal(0, indexer.OverloadResolutionPriority) Assert.Equal(0, indexer.GetMethod.OverloadResolutionPriority) Assert.Equal(0, indexer.SetMethod.OverloadResolutionPriority) End Sub <Fact> Public Sub AppliedToPropertyGetterSetter() Dim source = " Imports System.Runtime.CompilerServices Public Class C Property Prop As Integer <OverloadResolutionPriority(1)> Get throw DirectCast(Nothing, System.Exception) End Get <OverloadResolutionPriority(2)> Set throw DirectCast(Nothing, System.Exception) End Set End Property End Class " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) Dim c = comp.GetTypeByMetadataName("C") Dim indexer = c.GetMember(Of PropertySymbol)("Prop") Assert.Equal(0, indexer.OverloadResolutionPriority) Assert.Equal(0, indexer.GetMethod.OverloadResolutionPriority) Assert.Equal(0, indexer.SetMethod.OverloadResolutionPriority) comp.AssertTheseDiagnostics( <expected><![CDATA[ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <OverloadResolutionPriority(2)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact> Public Sub AppliedToEventGetterSetter() Dim source = " Imports System.Runtime.CompilerServices Public Class C Custom Event Prop As System.Action <OverloadResolutionPriority(1)> AddHandler(x as System.Action) End AddHandler <OverloadResolutionPriority(2)> RemoveHandler(x as System.Action) End RemoveHandler <OverloadResolutionPriority(3)> RaiseEvent() End RaiseEvent End Event End Class " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll.WithMetadataImportOptions(MetadataImportOptions.All)) Dim c = comp.GetTypeByMetadataName("C") Dim indexer = c.GetMember(Of EventSymbol)("Prop") Assert.Equal(0, indexer.AddMethod.OverloadResolutionPriority) Assert.Equal(0, indexer.RemoveMethod.OverloadResolutionPriority) Assert.Equal(0, indexer.RaiseMethod.OverloadResolutionPriority) comp.AssertTheseDiagnostics( <expected><![CDATA[ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <OverloadResolutionPriority(2)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <OverloadResolutionPriority(3)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact> Public Sub Dynamic() Dim source1 = " Imports System.Runtime.CompilerServices Public Class C <OverloadResolutionPriority(1)> Sub M(o As Long) throw DirectCast(Nothing, System.Exception) End Sub Sub M(s As String) System.Console.Write(2) End Sub <OverloadResolutionPriority(1)> Default Property Item(x As Long) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property Default Property Item(x As String) As Integer Get System.Console.Write(3) Return 0 End Get Set System.Console.Write(4) End Set End Property End Class " Dim source2 = " Option Strict Off public class Program Shared Sub Main Dim arg As Object = ""test"" Dim c = new C() c.M(arg) Dim x = c(arg) c(arg) = 0 End Sub End Class " Dim comp = CreateCompilation({source2, source1, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="234").VerifyDiagnostics() Dim comp1 = CreateCompilation({source1, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) Dim comp2 = CreateCompilation(source2, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="234").VerifyDiagnostics() Dim comp3 = CreateCompilation(source2, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="234").VerifyDiagnostics() End Sub <Fact> Public Sub Destructor() Dim source = " Imports System.Runtime.CompilerServices Public Class C <OverloadResolutionPriority(1)> Protected Overrides Sub Finalize() End Sub End Class " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) comp.AssertTheseDiagnostics( <expected><![CDATA[ BC37333: Cannot use 'OverloadResolutionPriorityAttribute' on an overriding member. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact> Public Sub BinaryOperators_SameType() Dim source1 = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface Public Class C <OverloadResolutionPriority(1)> Shared Operator + (c As C, i As I1) As C System.Console.Write(1) return c End Operator Shared Operator + (c As C, i As I2) As C throw DirectCast(Nothing, System.Exception) End Operator End Class " Dim source2 = " Option Strict Off public class Program Shared Sub Main Dim c = new C() Dim i3 As I3 = Nothing Dim x = c + i3 End Sub End Class " Dim comp = CreateCompilation({source2, source1, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="1").VerifyDiagnostics() Dim comp1 = CreateCompilation({source1, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) Dim comp2 = CreateCompilation(source2, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp2, expectedOutput:="1").VerifyDiagnostics() Dim comp3 = CreateCompilation(source2, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) CompileAndVerify(comp3, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub BinaryOperators_DifferentType() Dim source1 = " Imports System.Runtime.CompilerServices public interface I1 End Interface public interface I2 End Interface public interface I3 Inherits I1, I2 End Interface Public Class C1 <OverloadResolutionPriority(1)> Shared Operator + (c1 As C1, c2 As C2) As C1 throw DirectCast(Nothing, System.Exception) End Operator End Class Public Class C2 Shared Operator + (c1 As C1, c2 As C2) As C2 throw DirectCast(Nothing, System.Exception) End Operator End Class " Dim source2 = " Option Strict Off public class Program Shared Sub Main Dim c1 = new C1() Dim c2 = new C2() Dim x = c1 + c2 End Sub End Class " Dim comp = CreateCompilation({source2, source1, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) Dim errs As XElement = <expected> BC30521: Overload resolution failed because no accessible '+' is most specific for these arguments: 'Public Shared Operator C1.+(c1 As C1, c2 As C2) As C1': Not most specific. 'Public Shared Operator C2.+(c1 As C1, c2 As C2) As C2': Not most specific. Dim x = c1 + c2 ~~~~~~~ </expected> comp.AssertTheseDiagnostics(errs) Dim comp1 = CreateCompilation({source1, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) Dim comp2 = CreateCompilation(source2, references:={comp1.ToMetadataReference()}, options:=TestOptions.DebugExe) comp2.AssertTheseDiagnostics(errs) Dim comp3 = CreateCompilation(source2, references:={comp1.EmitToImageReference()}, options:=TestOptions.DebugExe) comp3.AssertTheseDiagnostics(errs) End Sub <Fact> Public Sub DisallowedOnStaticCtors() Dim source = " Imports System.Runtime.CompilerServices Public Class C <OverloadResolutionPriority(1)> Shared Sub New() End Sub End Class " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) comp.AssertTheseDiagnostics( <expected><![CDATA[ BC37334: Cannot use 'OverloadResolutionPriorityAttribute' on this member. <OverloadResolutionPriority(1)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Theory> <InlineData("<System.Runtime.CompilerServices.OverloadResolutionPriority(1)>", "")> <InlineData("", "<System.Runtime.CompilerServices.OverloadResolutionPriority(1)>")> Public Sub PartialMethod(definitionPriority As String, implementationPriority As String) Dim definition = " Public Partial Class C " + definitionPriority + " Private Partial Sub M(x As Object) End Sub End Class " Dim implementation = " Public Partial Class C " + implementationPriority + " Private Sub M(x As Object) System.Console.Write(1) End Sub Sub M(x As String) throw DirectCast(Nothing, System.Exception) End Sub End Class " Dim source2 = " Partial Class C Shared Sub Main() Dim c = new C() c.M("""") End Sub End Class " Dim comp1 = CreateCompilation({source2, definition, implementation, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp1, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub AttributeAppliedTwiceMethod_Source() Dim source = " Imports System.Runtime.CompilerServices Class C <OverloadResolutionPriority(1)> <OverloadResolutionPriority(2)> Shared Sub M(x As Object) End Sub Shared Sub M(x As String) End Sub End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC30663: Attribute 'OverloadResolutionPriorityAttribute' cannot be applied multiple times. <OverloadResolutionPriority(2)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected> ) Dim m = compilation.GetTypeByMetadataName("C").GetMembers("M").OfType(Of MethodSymbol)().First() Assert.Equal("Sub C.M(x As System.Object)", m.ToTestDisplayString()) Assert.Equal(2, m.OverloadResolutionPriority) End Sub <Fact> Public Sub AttributeAppliedTwiceMethod_Metadata() ' Equivalent to: ' public class C ' { ' [OverloadResolutionPriority(1)] ' [OverloadResolutionPriority(2)] ' public void M(object o) => System.Console.Write(1); ' public void M(string s) => System.Console.Write(2); ' } Dim il = " .class public auto ansi beforefieldinit C extends [mscorlib]System.Object { .method public hidebysig instance void M ( object o ) cil managed { .custom instance void System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) .custom instance void System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 ) ldc.i4.1 call void [mscorlib]System.Console::Write(int32) ret } // end of method C::M .method public hidebysig instance void M ( string s ) cil managed { ldc.i4.2 call void [mscorlib]System.Console::Write(int32) ret } // end of method C::M .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } // end of method C::.ctor } // end of class C " Dim ilRef = CompileIL(il + OverloadResolutionPriorityAttributeILDefinition) Dim source = " public class Program Shared Sub Main Dim c = new C() c.M(""test"") End Sub End Class " Dim comp = CreateCompilation(source, references:={ilRef}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="1").VerifyDiagnostics() Dim m = comp.GetTypeByMetadataName("C").GetMembers("M").OfType(Of MethodSymbol)().First() Assert.Equal("Sub C.M(o As System.Object)", m.ToTestDisplayString()) Assert.Equal(2, m.OverloadResolutionPriority) End Sub <Fact> Public Sub AttributeAppliedTwiceConstructor_Source() Dim source = " Imports System.Runtime.CompilerServices Class C <OverloadResolutionPriority(1)> <OverloadResolutionPriority(2)> Sub New(x As Object) End Sub Sub New(x As String) End Sub End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC30663: Attribute 'OverloadResolutionPriorityAttribute' cannot be applied multiple times. <OverloadResolutionPriority(2)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected> ) Dim m = compilation.GetTypeByMetadataName("C").GetMembers(".ctor").OfType(Of MethodSymbol)().First() Assert.Equal("Sub C..ctor(x As System.Object)", m.ToTestDisplayString()) Assert.Equal(2, m.OverloadResolutionPriority) End Sub <Fact> Public Sub AttributeAppliedTwiceConstructor_Metadata() ' Equivalent to: ' public class C ' { ' [OverloadResolutionPriority(1)] ' [OverloadResolutionPriority(2)] ' public C(object o) {} ' public C(string s) {} ' } Dim il = " .class public auto ansi beforefieldinit C extends [mscorlib]System.Object { .method public hidebysig specialname rtspecialname instance void .ctor ( object o ) cil managed { .custom instance void System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) .custom instance void System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 ) ldarg.0 call instance void [mscorlib]System.Object::.ctor() ldc.i4.1 call void [mscorlib]System.Console::Write(int32) ret } .method public hidebysig specialname rtspecialname instance void .ctor ( string s ) cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ldc.i4.2 call void [mscorlib]System.Console::Write(int32) ret } // end of method C::.ctor } // end of class C " Dim ilRef = CompileIL(il + OverloadResolutionPriorityAttributeILDefinition) Dim source = " public class Program Shared Sub Main Dim c = new C(""test"") End Sub End Class " Dim comp = CreateCompilation(source, references:={ilRef}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="1").VerifyDiagnostics() Dim m = comp.GetTypeByMetadataName("C").GetMembers(".ctor").OfType(Of MethodSymbol)().First() Assert.Equal("Sub C..ctor(o As System.Object)", m.ToTestDisplayString()) Assert.Equal(2, m.OverloadResolutionPriority) End Sub <Fact> Public Sub AttributeAppliedTwiceIndexer_Source() Dim source = " Imports System.Runtime.CompilerServices Class C <OverloadResolutionPriority(1)> <OverloadResolutionPriority(2)> Default Property Item(x As Object) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property Default Property Item(x As String) As Integer Get throw DirectCast(Nothing, System.Exception) End Get Set throw DirectCast(Nothing, System.Exception) End Set End Property End Class " Dim compilation = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugDll) compilation.AssertTheseDiagnostics( <expected><![CDATA[ BC30663: Attribute 'OverloadResolutionPriorityAttribute' cannot be applied multiple times. <OverloadResolutionPriority(2)> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected> ) Dim m = compilation.GetTypeByMetadataName("C").GetMembers("Item").OfType(Of PropertySymbol)().First() AssertEx.Equal("Property C.Item(x As System.Object) As System.Int32", m.ToTestDisplayString()) Assert.Equal(2, m.OverloadResolutionPriority) End Sub <Fact> Public Sub AttributeAppliedTwiceIndexer_Metadata() ' Equivalent to: ' public class C ' { ' [OverloadResolutionPriority(1)] ' [OverloadResolutionPriority(2)] ' public int this[object o] ' { ' get => throw null; ' set => throw null; ' } ' public int this[string o] ' { ' get => throw null; ' set => throw null; ' } ' } Dim il = " .class public auto ansi beforefieldinit C extends [mscorlib]System.Object { .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6d 00 00 ) // Methods .method public hidebysig specialname instance int32 get_Item ( object o ) cil managed { ldc.i4.1 call void [mscorlib]System.Console::Write(int32) ldc.i4.1 ret } // end of method C::get_Item .method public hidebysig specialname instance void set_Item ( object o, int32 'value' ) cil managed { ldc.i4.2 call void [mscorlib]System.Console::Write(int32) ret } // end of method C::set_Item .method public hidebysig specialname instance int32 get_Item ( string o ) cil managed { ldnull throw } // end of method C::get_Item .method public hidebysig specialname instance void set_Item ( string o, int32 'value' ) cil managed { ldnull throw } // end of method C::set_Item .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } // end of method C::.ctor // Properties .property instance int32 Item( object o ) { .custom instance void System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 ) .custom instance void System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 ) .get instance int32 C::get_Item(object) .set instance void C::set_Item(object, int32) } .property instance int32 Item( string o ) { .get instance int32 C::get_Item(string) .set instance void C::set_Item(string, int32) } } // end of class C " Dim ilRef = CompileIL(il + OverloadResolutionPriorityAttributeILDefinition) Dim source = " public class Program Shared Sub Main Dim c = new C() Dim x = c(""test"") c(""test"") = 0 End Sub End Class " Dim comp = CreateCompilation(source, references:={ilRef}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="12").VerifyDiagnostics() Dim m = comp.GetTypeByMetadataName("C").GetMembers("Item").OfType(Of PropertySymbol)().First() AssertEx.Equal("Property C.Item(o As System.Object) As System.Int32", m.ToTestDisplayString()) Assert.Equal(2, m.OverloadResolutionPriority) End Sub <Fact> Public Sub HonoredInsideExpressionTree() Dim source = " Imports System.Runtime.CompilerServices Class C <OverloadResolutionPriority(1)> Shared Sub M(x As Object) System.Console.Write(1) End Sub Shared Sub M(x As String) throw DirectCast(Nothing, System.Exception) End Sub End Class public class Program Shared Sub Main Dim e As System.Linq.Expressions.Expression(Of System.Action) = Sub() C.M(""test"") e.Compile()() End Sub End Class " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub QuerySyntax() Dim source = " Imports System Imports System.Runtime.CompilerServices Class C <OverloadResolutionPriority(1)> Function [Select](Of T)(selector As Func(Of Integer, T)) As C System.Console.Write(1) Return Me End Function Function [Select](selector As Func(Of Integer, Integer)) As C throw DirectCast(Nothing, System.Exception) End Function End Class public class Program Shared Sub Main Dim c As New C() Dim y = From x in c Select x End Sub End Class " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="1").VerifyDiagnostics() End Sub <Fact> Public Sub ObjectInitializers() Dim source = " Imports System Imports System.Collections Imports System.Collections.Generic Imports System.Runtime.CompilerServices class C Implements IEnumerable(Of Integer) private _list As New List(Of Integer) Sub Add(x As Integer) throw DirectCast(Nothing, System.Exception) End Sub <OverloadResolutionPriority(1)> Sub Add(x As Integer, Optional y As Integer = 0) _list.Add(x) End Sub Function GetEnumerator() As IEnumerator(Of Integer) Implements IEnumerable(Of Integer).GetEnumerator Return _list.GetEnumerator() End Function Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return Nothing End Function End Class class Program Shared Sub Main() Dim c As new C() from { 2 } for each i in c Console.Write(i) Next End Sub End Class " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="2").VerifyDiagnostics() End Sub <Theory> <InlineData(New Integer() {1, 2, 3})> <InlineData(New Integer() {1, 3, 2})> <InlineData(New Integer() {2, 1, 3})> <InlineData(New Integer() {2, 3, 1})> <InlineData(New Integer() {3, 1, 2})> <InlineData(New Integer() {3, 2, 1})> Public Sub ExtensionsOnlyFilteredByApplicability_01(methodOrder As Integer()) Dim e2Methods = "" For Each method In methodOrder Select Case method Case 1 e2Methods += " <OverloadResolutionPriority(-1)> <Extension> Sub R(x As Integer) Console.WriteLine(""E2.R(int)"") End Sub " Case 2 e2Methods += " <Extension> Sub R(x As String) Console.WriteLine(""E2.R(string)"") End Sub " Case 3 e2Methods += " <Extension> Sub R(x As Boolean) Console.WriteLine(""E2.R(bool)"") End Sub " Case Else Throw ExceptionUtilities.Unreachable() End Select Next Dim source = $" Imports System Imports System.Runtime.CompilerServices class Program Shared Sub Main() Dim x As Integer = 5 x.R() ' E1.R(int) End Sub End Class Module E1 <Extension> Sub R(x As Integer) Console.WriteLine(""E1.R(int)"") End Sub End Module Module E2 {e2Methods} End Module " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) comp.AssertTheseDiagnostics( <expected> BC30521: Overload resolution failed because no accessible 'R' is most specific for these arguments: Extension method 'Public Sub R()' defined in 'E1': Not most specific. Extension method 'Public Sub R()' defined in 'E2': Not most specific. x.R() ' E1.R(int) ~ </expected>) End Sub <Theory> <InlineData(New Integer() {1, 2, 3})> <InlineData(New Integer() {1, 3, 2})> <InlineData(New Integer() {2, 1, 3})> <InlineData(New Integer() {2, 3, 1})> <InlineData(New Integer() {3, 1, 2})> <InlineData(New Integer() {3, 2, 1})> Public Sub ExtensionsOnlyFilteredByApplicability_02(methodOrder As Integer()) Dim e2Methods = "" For Each method In methodOrder Select Case method Case 1 e2Methods += " <OverloadResolutionPriority(-1)> <Extension> Sub R(x As Integer) Console.WriteLine(""E2.R(int)"") End Sub " Case 2 e2Methods += " <Extension> Sub R(x As String) Console.WriteLine(""E2.R(string)"") End Sub " Case 3 e2Methods += " <OverloadResolutionPriority(-1)> <Extension> Sub R(x As Boolean) Console.WriteLine(""E2.R(bool)"") End Sub " Case Else Throw ExceptionUtilities.Unreachable() End Select Next Dim source = $" Imports System Imports System.Runtime.CompilerServices class Program Shared Sub Main() Dim x As Integer = 5 x.R() ' E1.R(int) End Sub End Class Module E1 <Extension> Sub R(x As Integer) Console.WriteLine(""E1.R(int)"") End Sub End Module Module E2 {e2Methods} End Module " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) comp.AssertTheseDiagnostics( <expected> BC30521: Overload resolution failed because no accessible 'R' is most specific for these arguments: Extension method 'Public Sub R()' defined in 'E1': Not most specific. Extension method 'Public Sub R()' defined in 'E2': Not most specific. x.R() ' E1.R(int) ~ </expected>) End Sub <Theory> <InlineData(New Integer() {1, 2, 3})> <InlineData(New Integer() {1, 3, 2})> <InlineData(New Integer() {2, 1, 3})> <InlineData(New Integer() {2, 3, 1})> <InlineData(New Integer() {3, 1, 2})> <InlineData(New Integer() {3, 2, 1})> Public Sub ExtensionsOnlyFilteredByApplicability_03(methodOrder As Integer()) Dim e2Methods = "" For Each method In methodOrder Select Case method Case 1 e2Methods += " <OverloadResolutionPriority(-1)> <Extension> Sub R(x As Integer) Console.WriteLine(""E2.R(int)"") End Sub " Case 2 e2Methods += " <Extension> Sub R(x As String) Console.WriteLine(""E2.R(string)"") End Sub " Case 3 e2Methods += " <Extension> Sub R(x As Object) Console.WriteLine(""E2.R(object)"") End Sub " Case Else Throw ExceptionUtilities.Unreachable() End Select Next Dim source = $" Imports System Imports System.Runtime.CompilerServices class Program Shared Sub Main() Dim x As Integer = 5 x.R() ' E1.R(int) End Sub End Class Module E1 <Extension> Sub R(x As Integer) Console.WriteLine(""E1.R(int)"") End Sub End Module Module E2 {e2Methods} End Module " Dim comp = CreateCompilation({source, OverloadResolutionPriorityAttributeDefinitionVB}, options:=TestOptions.DebugExe) CompileAndVerify(comp, expectedOutput:="E1.R(int)").VerifyDiagnostics() End Sub End Class End Namespace