/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Semantic/Semantics/InitOnlyMemberTests.vb
5 775 строк
190 KB
AlekseyTs
Adjust expected behavior for tests targeting late-bound access to init-only properties. (#57426)
28 окт 2021, 21:30
Не верифицирован
28 окт 2021, 21:30
77595a7
Код
Авторство
О чём код?
' 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.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Public Class InitOnlyMemberTests Inherits BasicTestBase Protected Const IsExternalInitTypeDefinition As String = " namespace System.Runtime.CompilerServices { public static class IsExternalInit { } } " <Fact> Public Sub EvaluationInitOnlySetter_01() Dim csSource = " public class C : System.Attribute { public int Property0 { init { System.Console.Write(value + "" 0 ""); } } public int Property1 { init { System.Console.Write(value + "" 1 ""); } } public int Property2 { init { System.Console.Write(value + "" 2 ""); } } public int Property3 { init { System.Console.Write(value + "" 3 ""); } } public int Property4 { init { System.Console.Write(value + "" 4 ""); } } public int Property5 { init { System.Console.Write(value + "" 5 ""); } } public int Property6 { init { System.Console.Write(value + "" 6 ""); } } public int Property7 { init { System.Console.Write(value + "" 7 ""); } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new B() With { .Property1 = 42, .Property2 = 43} End Sub End Class <C(Property7:= 48)> Class B Inherits C Public Sub New() Property0 = 41 Me.Property3 = 44 MyBase.Property4 = 45 MyClass.Property5 = 46 With Me .Property6 = 47 End With Me.GetType().GetCustomAttributes(False) End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="41 0 44 3 45 4 46 5 47 6 48 7 42 1 43 2 ").VerifyDiagnostics() Assert.True(DirectCast(comp1.GetMember(Of PropertySymbol)("C.Property0").SetMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Dim x = new B() With { .Property1 = 42, .Property2 = 43} ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Dim x = new B() With { .Property1 = 42, .Property2 = 43} ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. <C(Property7:= 48)> ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Property0 = 41 ~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me.Property3 = 44 ~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyBase.Property4 = 45 ~~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyClass.Property5 = 46 ~~~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. .Property6 = 47 ~~~~~~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() x.Property1 = 42 With New B() .Property2 = 43 End With Dim y As New B() With { .F = Sub() .Property3 = 44 End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y .Property4 = 45 End With With Me With y .Property6 = 47 End With End With Dim x as New B() x.Property0 = 41 Dim z = Sub() Property5 = 46 End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Property1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property1 = 42 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property2' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property2 = 43 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property3 = 44 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property4 = 45 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property6 = 47 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property0 = 41 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Property5 = 46 ~~~~~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Property0 = 41 Me.Property3 = 44 MyBase.Property4 = 45 MyClass.Property5 = 46 With Me .Property6 = 47 End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Property0 = 41 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me.Property3 = 44 ~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyBase.Property4 = 45 ~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyClass.Property5 = 46 ~~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property6 = 47 ~~~~~~~~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub EvaluationInitOnlySetter_02() Dim csSource = " public class C : System.Attribute { public int Property0 { init; get; } public int Property1 { init; get; } public int Property2 { init; get; } public int Property3 { init; get; } public int Property4 { init; get; } public int Property5 { init; get; } public int Property6 { init; get; } public int Property7 { init; get; } public int Property8 { init; get; } public int Property9 { init => throw new System.InvalidOperationException(); get => 0; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() With { .Property1 = 42 } System.Console.Write(b.Property0) System.Console.Write(" "c) System.Console.Write(b.Property1) System.Console.Write(" "c) System.Console.Write(b.Property2) System.Console.Write(" "c) System.Console.Write(b.Property3) System.Console.Write(" "c) System.Console.Write(b.Property4) System.Console.Write(" "c) System.Console.Write(b.Property5) System.Console.Write(" "c) System.Console.Write(b.Property6) System.Console.Write(" "c) System.Console.Write(DirectCast(b.GetType().GetCustomAttributes(False)(0), C).Property7) System.Console.Write(" "c) System.Console.Write(b.Property8) B.Init(b.Property9, 492) B.Init((b.Property9), 493) End Sub End Class <C(Property7:= 48)> Class B Inherits C Public Sub New() Property0 = 41 Me.Property3 = 44 MyBase.Property4 = 45 MyClass.Property5 = 46 With Me .Property6 = 47 End With Init(Property2, 43) Init((Property2), 430) With Me Init(.Property8, 49) Init((.Property9), 494) End With Dim b = Me Init(b.Property9, 490) Init((b.Property9), 491) With b Init(.Property9, 499) Init((.Property9), 450) End With Test() Dim d = Sub() Init(Property9, 600) Init((Property9), 601) End Sub d() End Sub Public Sub Test() With Me Init(.Property9, 495) Init((.Property9), 496) End With Init(Property9, 497) Init((Property9), 498) Dim b = Me With b Init(.Property9, 451) Init((.Property9), 452) End With End Sub Public Shared Sub Init(ByRef p as Integer, val As Integer) p = val End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16_9, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="41 42 43 44 45 46 47 48 49").VerifyDiagnostics() Assert.True(DirectCast(comp1.GetMember(Of PropertySymbol)("C.Property0").SetMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Dim b = new B() With { .Property1 = 42 } ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. B.Init(b.Property9, 492) ~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. <C(Property7:= 48)> ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Property0 = 41 ~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me.Property3 = 44 ~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyBase.Property4 = 45 ~~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyClass.Property5 = 46 ~~~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. .Property6 = 47 ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Property2, 43) ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(.Property8, 49) ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(b.Property9, 490) ~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(.Property9, 499) ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Property9, 600) ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(.Property9, 495) ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Property9, 497) ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(.Property9, 451) ~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() x.Property1 = 42 With New B() .Property2 = 43 End With Dim y As New B() With { .F = Sub() .Property3 = 44 End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y .Property4 = 45 End With With Me With y .Property6 = 47 End With End With Dim x as New B() x.Property0 = 41 Dim z = Sub() Property5 = 46 End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Property1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property1 = 42 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property2' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property2 = 43 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property3 = 44 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property4 = 45 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property6 = 47 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property0 = 41 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Property5 = 46 ~~~~~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Property0 = 41 Me.Property3 = 44 MyBase.Property4 = 45 MyClass.Property5 = 46 With Me .Property6 = 47 End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Property0 = 41 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me.Property3 = 44 ~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyBase.Property4 = 45 ~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyClass.Property5 = 46 ~~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property6 = 47 ~~~~~~~~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub EvaluationInitOnlySetter_03() Dim csSource = " public class C { public int this[int x] { init { System.Console.Write(value + "" ""); } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new B() End Sub End Class Class B Inherits C Public Sub New() Item(0) = 40 Me.Item(0) = 41 MyBase.Item(0) = 42 MyClass.Item(0) = 43 Me(0) = 44 With Me .Item(0) = 45 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="40 41 42 43 44 45 ").VerifyDiagnostics() Assert.True(DirectCast(comp1.GetMember(Of PropertySymbol)("C.Item").SetMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Item(0) = 40 ~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me.Item(0) = 41 ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyBase.Item(0) = 42 ~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyClass.Item(0) = 43 ~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me(0) = 44 ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. .Item(0) = 45 ~~~~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() x(0) = 40 x.Item(0) = 41 With New B() .Item(0) = 42 End With Dim y As New B() With { .F = Sub() .Item(0) = 43 End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y .Item(0) = 44 End With With Me With y .Item(0) = 45 End With End With Dim x as New B() x(0) = 46 x.Item(0) = 47 Dim z = Sub() Item(0) = 48 Me(0) = 49 End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x(0) = 40 ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Item(0) = 41 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) = 42 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) = 43 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) = 44 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) = 45 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x(0) = 46 ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Item(0) = 47 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Item(0) = 48 ~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me(0) = 49 ~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Item(0) = 40 Me(0) = 41 Me.Item(0) = 42 MyBase.Item(0) = 43 MyClass.Item(0) = 44 With Me .Item(0) = 45 End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Item(0) = 40 ~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me(0) = 41 ~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me.Item(0) = 42 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyBase.Item(0) = 43 ~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyClass.Item(0) = 44 ~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) = 45 ~~~~~~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub EvaluationInitOnlySetter_04() Dim csSource = " public class C : System.Attribute { private int[] _item = new int[36]; public int this[int x] { init { if (x > 8) { throw new System.InvalidOperationException(); } _item[x] = value; } get => _item[x]; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() B.Init(b(9), 49) B.Init((b(19)), 59) B.Init(b.Item(10), 50) B.Init((b.Item(20)), 60) With b B.Init(.Item(11), 51) B.Init((.Item(21)), 61) End With for i as Integer = 0 To 35 System.Console.Write(b(i)) System.Console.Write(" "c) Next End Sub End Class Class B Inherits C Public Sub New() Item(0) = 40 Me(1) = 41 Me.Item(2) = 42 MyBase.Item(3) = 43 MyClass.Item(4) = 44 With Me .Item(5) = 45 End With Init(Item(6), 46) Init((Item(22)), 62) Init(Me(7), 47) Init((Me(23)), 63) Dim b = Me Init(b(12), 52) Init((b(24)), 64) Init(b.Item(13), 53) Init((b.Item(25)), 65) With Me Init(.Item(8), 48) Init((.Item(26)), 66) End With With b Init(.Item(14), 54) Init((.Item(27)), 67) End With Test() Dim d = Sub() Init(Item(32), 72) Init((Item(33)), 73) Init(Me(34), 74) Init((Me(35)), 75) End Sub d() End Sub Public Sub Test() With Me Init(.Item(15), 55) Init((.Item(28)), 68) End With Init(Me(16), 56) Init((Me(29)), 69) Init(Item(17), 57) Init((Item(30)), 70) Dim b = Me With b Init(.Item(18), 58) Init((.Item(31)), 71) End With End Sub Public Shared Sub Init(ByRef p as Integer, val As Integer) p = val End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16_9, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="40 41 42 43 44 45 46 47 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0").VerifyDiagnostics() Assert.True(DirectCast(comp1.GetMember(Of PropertySymbol)("C.Item").SetMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. B.Init(b(9), 49) ~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. B.Init(b.Item(10), 50) ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. B.Init(.Item(11), 51) ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Item(0) = 40 ~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me(1) = 41 ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me.Item(2) = 42 ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyBase.Item(3) = 43 ~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyClass.Item(4) = 44 ~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. .Item(5) = 45 ~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Item(6), 46) ~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Me(7), 47) ~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(b(12), 52) ~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(b.Item(13), 53) ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(.Item(8), 48) ~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(.Item(14), 54) ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Item(32), 72) ~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Me(34), 74) ~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(.Item(15), 55) ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Me(16), 56) ~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Item(17), 57) ~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(.Item(18), 58) ~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() x(0) = 40 x.Item(1) = 41 With New B() .Item(2) = 42 End With Dim y As New B() With { .F = Sub() .Item(3) = 43 End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y .Item(4) = 44 End With With Me With y .Item(5) = 45 End With End With Dim x as New B() x(6) = 46 x.Item(7) = 47 Dim z = Sub() Item(8) = 48 Me(9) = 49 End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x(0) = 40 ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Item(1) = 41 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(2) = 42 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(3) = 43 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(4) = 44 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(5) = 45 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x(6) = 46 ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Item(7) = 47 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Item(8) = 48 ~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me(9) = 49 ~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Item(0) = 40 Me(1) = 41 Me.Item(2) = 42 MyBase.Item(3) = 43 MyClass.Item(4) = 44 With Me .Item(5) = 45 End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Item(0) = 40 ~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me(1) = 41 ~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me.Item(2) = 42 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyBase.Item(3) = 43 ~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyClass.Item(4) = 44 ~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(5) = 45 ~~~~~~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub EvaluationInitOnlySetter_05() Dim csSource = " public class C { public int Property0 { get => 0; init { System.Console.Write(value + "" 0 ""); } } public int Property1 { get => 0; init { System.Console.Write(value + "" 1 ""); } } public int Property2 { get => 0; init { System.Console.Write(value + "" 2 ""); } } public int Property3 { get => 0; init { System.Console.Write(value + "" 3 ""); } } public int Property4 { get => 0; init { System.Console.Write(value + "" 4 ""); } } public int Property5 { get => 0; init { System.Console.Write(value + "" 5 ""); } } public int Property6 { get => 0; init { System.Console.Write(value + "" 6 ""); } } public int Property7 { get => 0; init { System.Console.Write(value + "" 7 ""); } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x as New B() End Sub End Class Class B Inherits C Public Sub New() Property0 += 41 Me.Property3 += 44 MyBase.Property4 += 45 MyClass.Property5 += 46 With Me .Property6 += 47 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="41 0 44 3 45 4 46 5 47 6 ").VerifyDiagnostics() Assert.True(DirectCast(comp1.GetMember(Of PropertySymbol)("C.Property0").SetMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Property0 += 41 ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me.Property3 += 44 ~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyBase.Property4 += 45 ~~~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyClass.Property5 += 46 ~~~~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. .Property6 += 47 ~~~~~~~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() x.Property1 += 42 With New B() .Property2 += 43 End With Dim y As New B() With { .F = Sub() .Property3 += 44 End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y .Property4 += 45 End With With Me With y .Property6 += 47 End With End With Dim x as New B() x.Property0 += 41 Dim z = Sub() Property5 += 46 End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Property1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property1 += 42 ~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property2' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property2 += 43 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property3 += 44 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property4 += 45 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property6 += 47 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property0 += 41 ~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Property5 += 46 ~~~~~~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Property0 += 41 Me.Property3 += 44 MyBase.Property4 += 45 MyClass.Property5 += 46 With Me .Property6 += 47 End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Property0 += 41 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me.Property3 += 44 ~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyBase.Property4 += 45 ~~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyClass.Property5 += 46 ~~~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property6 += 47 ~~~~~~~~~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub EvaluationInitOnlySetter_06() Dim csSource = " public class C { public int this[int x] { get => 0; init { System.Console.Write(value + "" ""); } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new B() End Sub End Class Class B Inherits C Public Sub New() Item(0) += 40 Me.Item(0) += 41 MyBase.Item(0) += 42 MyClass.Item(0) += 43 Me(0) += 44 With Me .Item(0) += 45 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="40 41 42 43 44 45 ").VerifyDiagnostics() Assert.True(DirectCast(comp1.GetMember(Of PropertySymbol)("C.Item").SetMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Item(0) += 40 ~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me.Item(0) += 41 ~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyBase.Item(0) += 42 ~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. MyClass.Item(0) += 43 ~~~~~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me(0) += 44 ~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. .Item(0) += 45 ~~~~~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() x(0) += 40 x.Item(0) += 41 With New B() .Item(0) += 42 End With Dim y As New B() With { .F = Sub() .Item(0) += 43 End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y .Item(0) += 44 End With With Me With y .Item(0) += 45 End With End With Dim x as New B() x(0) += 46 x.Item(0) += 47 Dim z = Sub() Item(0) += 48 Me(0) += 49 End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x(0) += 40 ~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Item(0) += 41 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) += 42 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) += 43 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) += 44 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) += 45 ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x(0) += 46 ~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Item(0) += 47 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Item(0) += 48 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me(0) += 49 ~~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Item(0) += 40 Me(0) += 41 Me.Item(0) += 42 MyBase.Item(0) += 43 MyClass.Item(0) += 44 With Me .Item(0) += 45 End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Item(0) += 40 ~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me(0) += 41 ~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me.Item(0) += 42 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyBase.Item(0) += 43 ~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. MyClass.Item(0) += 44 ~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Item(0) += 45 ~~~~~~~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub EvaluationInitOnlySetter_07() Dim csSource = " public interface I { public int Property1 { init; } public int Property2 { init; } public int Property3 { init; } public int Property4 { init; } public int Property5 { init; } } public class C : I { public int Property1 { init { System.Console.Write(value + "" 1 ""); } } public int Property2 { init { System.Console.Write(value + "" 2 ""); } } public int Property3 { init { System.Console.Write(value + "" 3 ""); } } public int Property4 { init { System.Console.Write(value + "" 4 ""); } } public int Property5 { init { System.Console.Write(value + "" 5 ""); } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() M1(Of C)() M2(Of B)() End Sub Shared Sub M1(OF T As {New, I})() Dim x = new T() With { .Property1 = 42 } End Sub Shared Sub M2(OF T As {New, C})() Dim x = new T() With { .Property2 = 43 } End Sub End Class Class B Inherits C End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="42 1 43 2 ").VerifyDiagnostics() Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Dim x = new T() With { .Property1 = 42 } ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Dim x = new T() With { .Property2 = 43 } ~~~~~~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() End Sub Shared Sub M1(Of T As {New, I})() Dim x = New T() x.Property1 = 42 With New T() .Property2 = 43 End With End Sub Shared Sub M2(Of T As {New, C})() Dim x = New T() x.Property3 = 44 With New T() .Property4 = 45 End With End Sub Shared Sub M3(x As I) x.Property5 = 46 End Sub End Class Class B Inherits C End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Property1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property1 = 42 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property2' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property2 = 43 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property3 = 44 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property4 = 45 ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x.Property5 = 46 ~~~~~~~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) End Sub <Fact> Public Sub EvaluationInitOnlySetter_08() Dim csSource = " using System; using System.Runtime.InteropServices; [assembly: ImportedFromTypeLib(""GeneralPIA.dll"")] [assembly: Guid(""f9c2d51d-4f44-45f0-9eda-c9d599b58257"")] [ComImport()] [Guid(""f9c2d51d-4f44-45f0-9eda-c9d599b58277"")] [CoClass(typeof(C))] public interface I { public int Property1 { init; } public int Property2 { init; } } [Guid(""f9c2d51d-4f44-45f0-9eda-c9d599b58278"")] public class C : I { int I.Property1 { init { System.Console.Write(value + "" 1 ""); } } int I.Property2 { init { System.Console.Write(value + "" 2 ""); } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new I() With { .Property1 = 42 } End Sub End Class Class B Inherits C End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="42 1 ").VerifyDiagnostics() Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Dim x = new I() With { .Property1 = 42 } ~~~~~~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() With New I() .Property2 = 43 End With End Sub End Class Class B Inherits C End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Property2' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property2 = 43 ~~~~~~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) End Sub <Fact> Public Sub EvaluationInitOnlySetter_09() Dim csSource = " public class C { public int Property1 { init { System.Console.Write(value + "" 1 ""); } } public int Property2 { init { System.Console.Write(value + "" 2 ""); } } public int Property3 { init { System.Console.Write(value + "" 3 ""); } } public int Property4 { init { System.Console.Write(value + "" 4 ""); } } public int Property5 { init { System.Console.Write(value + "" 5 ""); } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Shared Sub New() Property1 = 41 Me.Property2 = 42 MyBase.Property3 = 43 MyClass.Property4 = 44 With Me .Property5 = 45 End With End Sub End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> 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. Property1 = 41 ~~~~~~~~~ BC30043: 'Me' is valid only within an instance method. Me.Property2 = 42 ~~ BC30043: 'MyBase' is valid only within an instance method. MyBase.Property3 = 43 ~~~~~~ BC30043: 'MyClass' is valid only within an instance method. MyClass.Property4 = 44 ~~~~~~~ BC30043: 'Me' is valid only within an instance method. With Me ~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .Property5 = 45 ~~~~~~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) End Sub <Fact> Public Sub EvaluationInitOnlySetter_10() Dim csSource = " public class C { public int P2 { init { System.Console.Write(value + "" 2 ""); } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new B() End Sub End Class Class B Inherits C Public Sub New() With (Me) .P2 = 42 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="42 2 ").VerifyDiagnostics() End Sub <Fact> Public Sub Overriding_01() Dim csSource = " public class C { public virtual int P0 { init { } } public virtual int P1 { init; get; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Class B1 Inherits C Public Overrides WriteOnly Property P0 As Integer Set End Set End Property Public Overrides Property P1 As Integer End Class Class B2 Inherits C Public Overrides Property P0 As Integer Public Overrides ReadOnly Property P1 As Integer End Class Class B3 Inherits C Public Overrides ReadOnly Property P0 As Integer Public Overrides WriteOnly Property P1 As Integer Set End Set End Property End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected1 = <expected> BC37312: 'Public Overrides WriteOnly Property P0 As Integer' cannot override init-only 'Public Overridable Overloads WriteOnly Property P0 As Integer'. Public Overrides WriteOnly Property P0 As Integer ~~ BC37312: 'Public Overrides Property P1 As Integer' cannot override init-only 'Public Overridable Overloads Property P1 As Integer'. Public Overrides Property P1 As Integer ~~ BC30362: 'Public Overrides Property P0 As Integer' cannot override 'Public Overridable Overloads WriteOnly Property P0 As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides Property P0 As Integer ~~ BC30362: 'Public Overrides ReadOnly Property P1 As Integer' cannot override 'Public Overridable Overloads Property P1 As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides ReadOnly Property P1 As Integer ~~ BC30362: 'Public Overrides ReadOnly Property P0 As Integer' cannot override 'Public Overridable Overloads WriteOnly Property P0 As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides ReadOnly Property P0 As Integer ~~ BC30362: 'Public Overrides WriteOnly Property P1 As Integer' cannot override 'Public Overridable Overloads Property P1 As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides WriteOnly Property P1 As Integer ~~ </expected> comp1.AssertTheseDiagnostics(expected1) Dim p0Set = comp1.GetMember(Of PropertySymbol)("B1.P0").SetMethod Assert.False(p0Set.IsInitOnly) Assert.True(p0Set.OverriddenMethod.IsInitOnly) Dim p1Set = comp1.GetMember(Of PropertySymbol)("B1.P1").SetMethod Assert.False(p1Set.IsInitOnly) Assert.True(p1Set.OverriddenMethod.IsInitOnly) Assert.False(comp1.GetMember(Of PropertySymbol)("B2.P0").SetMethod.IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics(expected1) End Sub <Fact> Public Sub Overriding_02() Dim csSource = " public class C<T> { public virtual T this[int x] { init { } } public virtual T this[short x] { init {} get => throw null; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Class B1 Inherits C(Of Integer) Public Overrides WriteOnly Property Item(x as Integer) As Integer Set End Set End Property Public Overrides Property Item(x as Short) As Integer Get Return Nothing End Get Set End Set End Property End Class Class B2 Inherits C(Of Integer) Public Overrides Property Item(x as Integer) As Integer Get Return Nothing End Get Set End Set End Property Public Overrides ReadOnly Property Item(x as Short) As Integer Get Return Nothing End Get End Property End Class Class B3 Inherits C(Of Integer) Public Overrides ReadOnly Property Item(x as Integer) As Integer Get Return Nothing End Get End Property Public Overrides WriteOnly Property Item(x as Short) As Integer Set End Set End Property End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected1 = <expected> BC37312: 'Public Overrides WriteOnly Property Item(x As Integer) As Integer' cannot override init-only 'Public Overridable Overloads WriteOnly Default Property Item(x As Integer) As Integer'. Public Overrides WriteOnly Property Item(x as Integer) As Integer ~~~~ BC37312: 'Public Overrides Property Item(x As Short) As Integer' cannot override init-only 'Public Overridable Overloads Default Property Item(x As Short) As Integer'. Public Overrides Property Item(x as Short) As Integer ~~~~ BC30362: 'Public Overrides Property Item(x As Integer) As Integer' cannot override 'Public Overridable Overloads WriteOnly Default Property Item(x As Integer) As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides Property Item(x as Integer) As Integer ~~~~ BC30362: 'Public Overrides ReadOnly Property Item(x As Short) As Integer' cannot override 'Public Overridable Overloads Default Property Item(x As Short) As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides ReadOnly Property Item(x as Short) As Integer ~~~~ BC30362: 'Public Overrides ReadOnly Property Item(x As Integer) As Integer' cannot override 'Public Overridable Overloads WriteOnly Default Property Item(x As Integer) As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides ReadOnly Property Item(x as Integer) As Integer ~~~~ BC30362: 'Public Overrides WriteOnly Property Item(x As Short) As Integer' cannot override 'Public Overridable Overloads Default Property Item(x As Short) As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides WriteOnly Property Item(x as Short) As Integer ~~~~ </expected> comp1.AssertTheseDiagnostics(expected1) Dim p0Set = comp1.GetTypeByMetadataName("B1").GetMembers("Item").OfType(Of PropertySymbol).First().SetMethod Assert.False(p0Set.IsInitOnly) Assert.True(p0Set.OverriddenMethod.IsInitOnly) Assert.True(DirectCast(p0Set.OverriddenMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics(expected1) End Sub <Fact> Public Sub Overriding_03() Dim csSource = " public class A { public virtual int P1 { init; get; } public virtual int P2 { init; get; } } public class B : A { public override int P1 { get => throw null; } public override int P2 { init {} } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Class C1 Inherits B Public Overrides WriteOnly Property P1 As Integer Set End Set End Property Public Overrides WriteOnly Property P2 As Integer Set End Set End Property End Class Class C2 Inherits B Public Overrides Property P1 As Integer Public Overrides Property P2 As Integer End Class Class C3 Inherits B Public Overrides ReadOnly Property P1 As Integer Public Overrides ReadOnly Property P2 As Integer End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected1 = <expected> BC30362: 'Public Overrides WriteOnly Property P1 As Integer' cannot override 'Public Overrides ReadOnly Property P1 As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides WriteOnly Property P1 As Integer ~~ BC37312: 'Public Overrides WriteOnly Property P2 As Integer' cannot override init-only 'Public Overrides WriteOnly Property P2 As Integer'. Public Overrides WriteOnly Property P2 As Integer ~~ BC30362: 'Public Overrides Property P1 As Integer' cannot override 'Public Overrides ReadOnly Property P1 As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides Property P1 As Integer ~~ BC30362: 'Public Overrides Property P2 As Integer' cannot override 'Public Overrides WriteOnly Property P2 As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides Property P2 As Integer ~~ BC30362: 'Public Overrides ReadOnly Property P2 As Integer' cannot override 'Public Overrides WriteOnly Property P2 As Integer' because they differ by 'ReadOnly' or 'WriteOnly'. Public Overrides ReadOnly Property P2 As Integer ~~ </expected> comp1.AssertTheseDiagnostics(expected1) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics(expected1) End Sub <Fact()> Public Sub Overriding_04() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit CL1 extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { IL_0000: ldarg.0 IL_0001: call instance void System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 get_P() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void set_P(int32 x) cil managed { ret } .property instance int32 P() { .get instance int32 CL1::get_P() .set instance void CL1::set_P(int32) } .method public hidebysig newslot virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P(int32 x) cil managed { ret } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL1::get_P() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL1::set_P(int32) } } // end of class CL1 .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Inherits CL1 Overrides Property P As Integer End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, options:=TestOptions.ReleaseDll) CompileAndVerify(compilation).VerifyDiagnostics() Dim p = compilation.GetMember(Of PropertySymbol)("Test.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.False(pSet.OverriddenMethod.IsInitOnly) Assert.Empty(pSet.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(p.GetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(p.OverriddenProperty.TypeCustomModifiers) End Sub <Fact()> Public Sub Overriding_05() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit CL1 extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { IL_0000: ldarg.0 IL_0001: call instance void System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P(int32 x) cil managed { ret } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL1::get_P() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL1::set_P(int32) } .method public hidebysig newslot virtual instance int32 get_P() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void set_P(int32 x) cil managed { ret } .property instance int32 P() { .get instance int32 CL1::get_P() .set instance void CL1::set_P(int32) } } // end of class CL1 .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Inherits CL1 Overrides Property P As Integer End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, options:=TestOptions.ReleaseDll) CompileAndVerify(compilation).VerifyDiagnostics() Dim p = compilation.GetMember(Of PropertySymbol)("Test.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.False(pSet.OverriddenMethod.IsInitOnly) Assert.Empty(pSet.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(p.GetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(p.OverriddenProperty.TypeCustomModifiers) End Sub <Fact()> Public Sub Overriding_06() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit CL1 extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { IL_0000: ldarg.0 IL_0001: call instance void System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 get_P() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void set_P(int32 x) cil managed { ret } .property instance int32 modopt(CL1) P() { .get instance int32 CL1::get_P() .set instance void CL1::set_P(int32) } .method public hidebysig newslot virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P(int32 x) cil managed { ret } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL1::get_P() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL1::set_P(int32) } } // end of class CL1 .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Inherits CL1 Overrides Property P As Integer End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30935: Member 'Public Overridable Overloads Property P As Integer' that matches this signature cannot be overridden because the class 'CL1' contains multiple members with this same name and signature: 'Public Overridable Overloads Property P As Integer' 'Public Overridable Overloads Property P As Integer' Overrides Property P As Integer ~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("Test.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.False(pSet.OverriddenMethod.IsInitOnly) Assert.Empty(pSet.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(p.GetMethod.OverriddenMethod.ReturnTypeCustomModifiers) End Sub <Fact()> Public Sub Overriding_07() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit CL1 extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { IL_0000: ldarg.0 IL_0001: call instance void System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P(int32 x) cil managed { ret } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL1::get_P() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL1::set_P(int32) } .method public hidebysig newslot virtual instance int32 get_P() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void set_P(int32 x) cil managed { ret } .property instance int32 modopt(CL1) P() { .get instance int32 CL1::get_P() .set instance void CL1::set_P(int32) } } // end of class CL1 .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Inherits CL1 Overrides Property P As Integer End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30935: Member 'Public Overridable Overloads Property P As Integer' that matches this signature cannot be overridden because the class 'CL1' contains multiple members with this same name and signature: 'Public Overridable Overloads Property P As Integer' 'Public Overridable Overloads Property P As Integer' Overrides Property P As Integer ~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("Test.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.True(pSet.OverriddenMethod.IsInitOnly) Assert.NotEmpty(pSet.OverriddenMethod.ReturnTypeCustomModifiers) Assert.NotEmpty(p.GetMethod.OverriddenMethod.ReturnTypeCustomModifiers) End Sub <Fact()> Public Sub Overriding_08() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit CL1 extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { IL_0000: ldarg.0 IL_0001: call instance void System.Object::.ctor() IL_0006: ret } .method public hidebysig newslot virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P1() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P1(int32 x) cil managed { ret } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P1() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL1::get_P1() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL1::set_P1(int32) } .method public hidebysig newslot virtual instance int32 get_P1() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void set_P1(int32 x) cil managed { ret } .property instance int32 P1() { .get instance int32 CL1::get_P1() .set instance void CL1::set_P1(int32) } .method public hidebysig newslot virtual instance int32 get_P2() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void set_P2(int32 x) cil managed { ret } .property instance int32 P2() { .get instance int32 CL1::get_P2() .set instance void CL1::set_P2(int32) } .method public hidebysig newslot virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P2() cil managed { ldc.i4.s 123 ret } .method public hidebysig newslot virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P2(int32 x) cil managed { ret } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P2() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL1::get_P2() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL1::set_P2(int32) } } // end of class CL1 .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } .class public auto ansi beforefieldinit CL2 extends CL1 { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { IL_0000: ldarg.0 IL_0001: call instance void CL1::.ctor() IL_0006: ret } .method public hidebysig virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P1() cil managed { ldc.i4.s 123 ret } .method public hidebysig virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P1(int32 x) cil managed { ret } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P1() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL2::get_P1() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL2::set_P1(int32) } .method public hidebysig virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P2() cil managed { ldc.i4.s 123 ret } .method public hidebysig virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P2(int32 x) cil managed { ret } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P2() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL2::get_P2() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL2::set_P2(int32) } } .class public auto ansi beforefieldinit CL3 extends CL1 { .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { IL_0000: ldarg.0 IL_0001: call instance void CL1::.ctor() IL_0006: ret } .method public hidebysig virtual instance int32 get_P1() cil managed { ldc.i4.s 123 ret } .method public hidebysig virtual instance void set_P1(int32 x) cil managed { ret } .property instance int32 P1() { .get instance int32 CL3::get_P1() .set instance void CL3::set_P1(int32) } .method public hidebysig virtual instance int32 get_P2() cil managed { ldc.i4.s 123 ret } .method public hidebysig virtual instance void set_P2(int32 x) cil managed { ret } .property instance int32 P2() { .get instance int32 CL3::get_P2() .set instance void CL3::set_P2(int32) } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ ]]></file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, options:=TestOptions.ReleaseDll) Dim cl2p1 = compilation.GetMember(Of PropertySymbol)("CL2.P1") Assert.NotEmpty(cl2p1.SetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.NotEmpty(cl2p1.GetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.NotEmpty(cl2p1.OverriddenProperty.TypeCustomModifiers) Dim cl2p2 = compilation.GetMember(Of PropertySymbol)("CL2.P2") Assert.NotEmpty(cl2p2.SetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.NotEmpty(cl2p2.GetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.NotEmpty(cl2p2.OverriddenProperty.TypeCustomModifiers) Dim cl3p1 = compilation.GetMember(Of PropertySymbol)("CL3.P1") Assert.Empty(cl3p1.SetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(cl3p1.GetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(cl3p1.OverriddenProperty.TypeCustomModifiers) Dim cl3p2 = compilation.GetMember(Of PropertySymbol)("CL3.P2") Assert.Empty(cl3p2.SetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(cl3p2.GetMethod.OverriddenMethod.ReturnTypeCustomModifiers) Assert.Empty(cl3p2.OverriddenProperty.TypeCustomModifiers) End Sub <Fact> Public Sub Implementing_01() Dim csSource = " public interface I { int P0 { init; } int P1 { init; get; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Class B1 Implements I Public WriteOnly Property P0 As Integer Implements I.P0 Set End Set End Property Public Property P1 As Integer Implements I.P1 End Class Class B2 Implements I Public Property P0 As Integer Implements I.P0 Public ReadOnly Property P1 As Integer Implements I.P1 End Class Class B3 Implements I Public ReadOnly Property P0 As Integer Implements I.P0 Public WriteOnly Property P1 As Integer Implements I.P1 Set End Set End Property End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected1 = <expected> BC37313: Init-only 'WriteOnly Property P0 As Integer' cannot be implemented. Public WriteOnly Property P0 As Integer Implements I.P0 ~~~~ BC37313: Init-only 'Property P1 As Integer' cannot be implemented. Public Property P1 As Integer Implements I.P1 ~~~~ BC37313: Init-only 'WriteOnly Property P0 As Integer' cannot be implemented. Public Property P0 As Integer Implements I.P0 ~~~~ BC31444: 'Property P1 As Integer' cannot be implemented by a ReadOnly property. Public ReadOnly Property P1 As Integer Implements I.P1 ~~~~ BC31444: 'WriteOnly Property P0 As Integer' cannot be implemented by a ReadOnly property. Public ReadOnly Property P0 As Integer Implements I.P0 ~~~~ BC31444: 'Property P1 As Integer' cannot be implemented by a WriteOnly property. Public WriteOnly Property P1 As Integer Implements I.P1 ~~~~ BC37313: Init-only 'Property P1 As Integer' cannot be implemented. Public WriteOnly Property P1 As Integer Implements I.P1 ~~~~ </expected> comp1.AssertTheseDiagnostics(expected1) Dim p0Set = comp1.GetMember(Of PropertySymbol)("B1.P0").SetMethod Assert.False(p0Set.IsInitOnly) Dim p1Set = comp1.GetMember(Of PropertySymbol)("B1.P1").SetMethod Assert.False(p1Set.IsInitOnly) Assert.False(comp1.GetMember(Of PropertySymbol)("B2.P0").SetMethod.IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics(expected1) End Sub <Fact> Public Sub Implementing_02() Dim csSource = " public interface I { int this[int x] { init; } int this[short x] { init; get; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Class B1 Implements I Public WriteOnly Property Item(x As Integer) As Integer Implements I.Item Set End Set End Property Public Property Item(x As Short) As Integer Implements I.Item Get Return Nothing End Get Set End Set End Property End Class Class B2 Implements I Public Property Item(x As Integer) As Integer Implements I.Item Get Return Nothing End Get Set End Set End Property Public ReadOnly Property Item(x As Short) As Integer Implements I.Item Get Return Nothing End Get End Property End Class Class B3 Implements I Public ReadOnly Property Item(x As Integer) As Integer Implements I.Item Get Return Nothing End Get End Property Public WriteOnly Property Item(x As Short) As Integer Implements I.Item Set End Set End Property End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected1 = <expected> BC37313: Init-only 'WriteOnly Default Property Item(x As Integer) As Integer' cannot be implemented. Public WriteOnly Property Item(x As Integer) As Integer Implements I.Item ~~~~~~ BC37313: Init-only 'Default Property Item(x As Short) As Integer' cannot be implemented. Public Property Item(x As Short) As Integer Implements I.Item ~~~~~~ BC37313: Init-only 'WriteOnly Default Property Item(x As Integer) As Integer' cannot be implemented. Public Property Item(x As Integer) As Integer Implements I.Item ~~~~~~ BC31444: 'Default Property Item(x As Short) As Integer' cannot be implemented by a ReadOnly property. Public ReadOnly Property Item(x As Short) As Integer Implements I.Item ~~~~~~ BC31444: 'WriteOnly Default Property Item(x As Integer) As Integer' cannot be implemented by a ReadOnly property. Public ReadOnly Property Item(x As Integer) As Integer Implements I.Item ~~~~~~ BC31444: 'Default Property Item(x As Short) As Integer' cannot be implemented by a WriteOnly property. Public WriteOnly Property Item(x As Short) As Integer Implements I.Item ~~~~~~ BC37313: Init-only 'Default Property Item(x As Short) As Integer' cannot be implemented. Public WriteOnly Property Item(x As Short) As Integer Implements I.Item ~~~~~~ </expected> comp1.AssertTheseDiagnostics(expected1) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics(expected1) End Sub <Fact> Public Sub Implementing_03() Dim csSource = " public interface I { int P0 { set; get; } int P1 { init; get; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Class B2 Implements I Public Property P0 As Integer Implements I.P0, I.P1 End Class Class B3 Implements I Public Property P0 As Integer Implements I.P1, I.P0 End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected1 = <expected> BC37313: Init-only 'Property P1 As Integer' cannot be implemented. Public Property P0 As Integer Implements I.P0, I.P1 ~~~~ BC37313: Init-only 'Property P1 As Integer' cannot be implemented. Public Property P0 As Integer Implements I.P1, I.P0 ~~~~ </expected> comp1.AssertTheseDiagnostics(expected1) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics(expected1) End Sub <Fact()> Public Sub Implementing_04() Dim ilSource = <![CDATA[ .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance int32 get_P() cil managed { } .method public hidebysig newslot specialname abstract virtual instance void set_P(int32 x) cil managed { } .property instance int32 P() { .get instance int32 CL1::get_P() .set instance void CL1::set_P(int32) } .method public hidebysig newslot specialname abstract virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P() cil managed { } .method public hidebysig newslot specialname abstract virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P(int32 x) cil managed { } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL1::get_P() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL1::set_P(int32) } } // end of class CL1 .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Implements CL1 Property P As Integer Implements CL1.P End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30149: Class 'Test' must implement 'Property P As Integer' for interface 'CL1'. Implements CL1 ~~~ BC30937: Member 'CL1.P' that matches this signature cannot be implemented because the interface 'CL1' contains multiple members with this same name and signature: 'Property P As Integer' 'Property P As Integer' Property P As Integer Implements CL1.P ~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("Test.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.False(pSet.ExplicitInterfaceImplementations.Single().IsInitOnly) Assert.Empty(pSet.ExplicitInterfaceImplementations.Single().ReturnTypeCustomModifiers) Assert.Empty(p.GetMethod.ExplicitInterfaceImplementations.Single().ReturnTypeCustomModifiers) Assert.Empty(p.ExplicitInterfaceImplementations.Single().TypeCustomModifiers) End Sub <Fact()> Public Sub Implementing_05() Dim ilSource = <![CDATA[ .class interface public abstract auto ansi CL1 { .method public hidebysig newslot specialname abstract virtual instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) get_P() cil managed { } .method public hidebysig newslot specialname abstract virtual instance void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P(int32 x) cil managed { } .property instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) P() { .get instance int32 modopt(System.Runtime.CompilerServices.IsExternalInit) CL1::get_P() .set instance void modreq(System.Runtime.CompilerServices.IsExternalInit) CL1::set_P(int32) } .method public hidebysig newslot specialname abstract virtual instance int32 get_P() cil managed { } .method public hidebysig newslot specialname abstract virtual instance void set_P(int32 x) cil managed { } .property instance int32 P() { .get instance int32 CL1::get_P() .set instance void CL1::set_P(int32) } } // end of class CL1 .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Implements CL1 Property P As Integer Implements CL1.P End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30149: Class 'Test' must implement 'Property P As Integer' for interface 'CL1'. Implements CL1 ~~~ BC30937: Member 'CL1.P' that matches this signature cannot be implemented because the interface 'CL1' contains multiple members with this same name and signature: 'Property P As Integer' 'Property P As Integer' Property P As Integer Implements CL1.P ~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("Test.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.True(pSet.ExplicitInterfaceImplementations.Single().IsInitOnly) Assert.NotEmpty(pSet.ExplicitInterfaceImplementations.Single().ReturnTypeCustomModifiers) Assert.NotEmpty(p.GetMethod.ExplicitInterfaceImplementations.Single().ReturnTypeCustomModifiers) Assert.NotEmpty(p.ExplicitInterfaceImplementations.Single().TypeCustomModifiers) End Sub <ConditionalFact(GetType(CoreClrOnly))> <WorkItem(56665, "https://github.com/dotnet/roslyn/issues/56665")> Public Sub LateBound_01() Dim csSource = " public class C { public int P0 { init; get; } public int P1 { init; get; } public int P2 { init; get; } public int P3 { init; get; } private int[] _item = new int[10]; public int this[int x] { init => _item[x] = value; get => _item[x]; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() Dim ob As Object = b Dim x = new C() Dim ox As Object = x Try ox.P0 = -40 Catch ex As System.MissingMemberException System.Console.Write(x.P0) System.Console.Write(" ") End Try b.Init(ox.P1, -41) ob.Init(x.P2, -42) ob.Init(ox.P3, -43) System.Console.Write(x.P1) System.Console.Write(" ") System.Console.Write(x.P2) System.Console.Write(" ") System.Console.Write(x.P3) Try ox(0) = 40 Catch ex As System.MissingMemberException System.Console.Write(" ") System.Console.Write(x(0)) End Try Try ox.Item(1) = 41 Catch ex As System.MissingMemberException System.Console.Write(" ") System.Console.Write(x(1)) End Try b.Init(ox(2), 42) ob.Init(x(3), 43) b.Init(ox.Item(4), 44) ob.Init(x.Item(5), 45) ob.Init(ox(6), 46) ob.Init(ox.Item(7), 47) For i as Integer = 2 To 7 System.Console.Write(" ") System.Console.Write(x(i)) Next End Sub End Class Class B Public Sub Init(ByRef p as Integer, val As Integer) p = val End Sub End Class ]]></file> </compilation> Dim expectedOutput As String = "0 0 0 0 0 0 0 0 0 0 0 0" Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:=expectedOutput).VerifyDiagnostics() Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp2, expectedOutput:=expectedOutput).VerifyDiagnostics() End Sub <ConditionalFact(GetType(CoreClrOnly))> <WorkItem(56665, "https://github.com/dotnet/roslyn/issues/56665")> Public Sub LateBound_02() Dim csSource = " public class C { private int[] _item = new int[12]; public int this[int x] { init => _item[x] = value; get => _item[x]; } public int this[short x] { init => throw null; get => throw null; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() Dim ob As Object = b Dim x = new C() Dim ox As Object = x Try ox(0) = 40 Catch ex As System.MissingMemberException System.Console.Write(x(0)) End Try Try ox.Item(1) = 41 Catch ex As System.MissingMemberException System.Console.Write(" ") System.Console.Write(x(1)) End Try Try x(CObj(2)) = 42 Catch ex As System.MissingMemberException System.Console.Write(" ") System.Console.Write(x(2)) End Try Try x.Item(CObj(3)) = 43 Catch ex As System.MissingMemberException System.Console.Write(" ") System.Console.Write(x(3)) End Try b.Init(ox(4), 44) ob.Init(ox(5), 45) b.Init(ox.Item(6), 46) ob.Init(ox.Item(7), 47) b.Init(x(CObj(8)), 48) ob.Init(x(CObj(9)), 49) b.Init(x.Item(CObj(10)), 50) ob.Init(x.Item(CObj(11)), 51) For i as Integer = 4 To 11 System.Console.Write(" ") System.Console.Write(x(i)) Next End Sub End Class Class B Public Sub Init(ByRef p as Integer, val As Integer) p = val End Sub End Class ]]></file> </compilation> Dim expectedOutput As String = "0 0 0 0 0 0 0 0 0 0 0 0" Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:=expectedOutput).VerifyDiagnostics() Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp2, expectedOutput:=expectedOutput).VerifyDiagnostics() End Sub <Fact> Public Sub Redim_01() Dim csSource = " public class C { public int[] Property0 { init; get; } public int[] Property1 { init; get; } public int[] Property2 { init; get; } public int[] Property3 { init; get; } public int[] Property4 { init; get; } public int[] Property5 { init; get; } public int[] Property6 { init; get; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.Property0.Length) System.Console.Write(" "c) System.Console.Write(b.Property3.Length) System.Console.Write(" "c) System.Console.Write(b.Property4.Length) System.Console.Write(" "c) System.Console.Write(b.Property5.Length) System.Console.Write(" "c) System.Console.Write(b.Property6.Length) End Sub End Class Class B Inherits C Public Sub New() ReDim Property0(41) Redim Me.Property3(44), MyBase.Property4(45), MyClass.Property5(46) With Me Redim .Property6(47) End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16_9, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="42 45 46 47 48").VerifyDiagnostics() Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. ReDim Property0(41) ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Redim Me.Property3(44), MyBase.Property4(45), MyClass.Property5(46) ~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Redim Me.Property3(44), MyBase.Property4(45), MyClass.Property5(46) ~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Redim Me.Property3(44), MyBase.Property4(45), MyClass.Property5(46) ~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Redim .Property6(47) ~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() ReDim x.Property1(42) With New B() Redim .Property2(43) End With Dim y As New B() With { .F = Sub() ReDim .Property3(44) End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y Redim .Property4(45) End With With Me With y Redim .Property6(47) End With End With Dim x as New B() Redim x.Property0(41) Dim z = Sub() Redim Property5(46) End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Property1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim x.Property1(42) ~~~~~~~~~~~ BC37311: Init-only property 'Property2' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Redim .Property2(43) ~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim .Property3(44) ~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Redim .Property4(45) ~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Redim .Property6(47) ~~~~~~~~~~ BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Redim x.Property0(41) ~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Redim Property5(46) ~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() ReDim Property0(41) ReDim Me.Property3(44), MyBase.Property4(45), MyClass.Property5(46) With Me ReDim .Property6(47) End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Property0(41) ~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Me.Property3(44), MyBase.Property4(45), MyClass.Property5(46) ~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Me.Property3(44), MyBase.Property4(45), MyClass.Property5(46) ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Me.Property3(44), MyBase.Property4(45), MyClass.Property5(46) ~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim .Property6(47) ~~~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub Redim_02() Dim csSource = " public class C { private int[][] _item = new int[6][]; public int[] this[int x] { init { _item[x] = value; } get => _item[x]; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() for i as Integer = 0 To 5 System.Console.Write(b(i).Length) System.Console.Write(" "c) Next End Sub End Class Class B Inherits C Public Sub New() ReDim Item(0)(40) ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) With Me ReDim .Item(5)(45) End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16_9, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="41 42 43 44 45 46").VerifyDiagnostics() Assert.True(DirectCast(comp1.GetMember(Of PropertySymbol)("C.Item").SetMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. ReDim Item(0)(40) ~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) ~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) ~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. ReDim .Item(5)(45) ~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() ReDim x(0)(40) ReDim x.Item(1)(41) With New B() ReDim .Item(2)(42) End With Dim y As New B() With { .F = Sub() ReDim .Item(3)(43) End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y ReDim .Item(4)(44) End With With Me With y ReDim .Item(5)(45) End With End With Dim x as New B() ReDim x(6)(46) ReDim x.Item(7)(47) Dim z = Sub() ReDim Item(8)(48) ReDim Me(9)(49) End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim x(0)(40) ~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim x.Item(1)(41) ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim .Item(2)(42) ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim .Item(3)(43) ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim .Item(4)(44) ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim .Item(5)(45) ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim x(6)(46) ~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim x.Item(7)(47) ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Item(8)(48) ~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Me(9)(49) ~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() ReDim Item(0)(40) ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) With Me ReDim .Item(5)(45) End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Item(0)(40) ~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) ~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) ~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim Me(1)(41), Me.Item(2)(42), MyBase.Item(3)(43), MyClass.Item(4)(44) ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. ReDim .Item(5)(45) ~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub Erase_01() Dim csSource = " public class C { public int[] Property0 { init; get; } = new int[] {}; public int[] Property1 { init; get; } = new int[] {}; public int[] Property2 { init; get; } = new int[] {}; public int[] Property3 { init; get; } = new int[] {}; public int[] Property4 { init; get; } = new int[] {}; public int[] Property5 { init; get; } = new int[] {}; public int[] Property6 { init; get; } = new int[] {}; } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.Property0 Is Nothing) System.Console.Write(" "c) System.Console.Write(b.Property3 Is Nothing) System.Console.Write(" "c) System.Console.Write(b.Property4 Is Nothing) System.Console.Write(" "c) System.Console.Write(b.Property5 Is Nothing) System.Console.Write(" "c) System.Console.Write(b.Property6 Is Nothing) End Sub End Class Class B Inherits C Public Sub New() Erase Property0 Erase Me.Property3, MyBase.Property4, MyClass.Property5 With Me Erase .Property6 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16_9, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="True True True True True").VerifyDiagnostics() Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Property0 ~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Me.Property3, MyBase.Property4, MyClass.Property5 ~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Me.Property3, MyBase.Property4, MyClass.Property5 ~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Me.Property3, MyBase.Property4, MyClass.Property5 ~~~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase .Property6 ~~~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() Erase x.Property1 With New B() Erase .Property2 End With Dim y As New B() With { .F = Sub() Erase .Property3 End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y Erase .Property4 End With With Me With y Erase .Property6 End With End With Dim x as New B() Erase x.Property0 Dim z = Sub() Erase Property5 End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Property1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase x.Property1 ~~~~~~~~~~~ BC37311: Init-only property 'Property2' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Property2 ~~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Property3 ~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Property4 ~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Property6 ~~~~~~~~~~ BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase x.Property0 ~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Property5 ~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Erase Property0 Erase Me.Property3, MyBase.Property4, MyClass.Property5 With Me Erase .Property6 End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Property0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Property0 ~~~~~~~~~ BC37311: Init-only property 'Property3' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Me.Property3, MyBase.Property4, MyClass.Property5 ~~~~~~~~~~~~ BC37311: Init-only property 'Property4' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Me.Property3, MyBase.Property4, MyClass.Property5 ~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property5' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Me.Property3, MyBase.Property4, MyClass.Property5 ~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'Property6' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Property6 ~~~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub Erase_02() Dim csSource = " public class C { private int[][] _item = new int[6][] {new int[]{}, new int[]{}, new int[]{}, new int[]{}, new int[]{}, new int[]{}}; public int[] this[int x] { init { _item[x] = value; } get => _item[x]; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() for i as Integer = 0 To 5 System.Console.Write(b(i) Is Nothing) System.Console.Write(" "c) Next End Sub End Class Class B Inherits C Public Sub New() Erase Item(0) Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) With Me Erase .Item(5) End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16_9, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="True True True True True True ").VerifyDiagnostics() Assert.True(DirectCast(comp1.GetMember(Of PropertySymbol)("C.Item").SetMethod, IMethodSymbol).IsInitOnly) Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Item(0) ~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) ~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) ~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) ~~~~~~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Erase .Item(5) ~~~~~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() Erase x(0) Erase x.Item(1) With New B() Erase .Item(2) End With Dim y As New B() With { .F = Sub() Erase .Item(3) End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y Erase .Item(4) End With With Me With y Erase .Item(5) End With End With Dim x as New B() Erase x(6) Erase x.Item(7) Dim z = Sub() Erase Item(8) Erase Me(9) End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase x(0) ~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase x.Item(1) ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Item(2) ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Item(3) ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Item(4) ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Item(5) ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase x(6) ~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase x.Item(7) ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Item(8) ~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Me(9) ~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Erase Item(0) Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) With Me Erase .Item(5) End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Item(0) ~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) ~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) ~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) ~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase Me(1), Me.Item(2), MyBase.Item(3), MyClass.Item(4) ~~~~~~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Erase .Item(5) ~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact> Public Sub DictionaryAccess_01() Dim csSource = " public class C { private int[] _item = new int[36]; public int this[string id] { init { int x = int.Parse(id.Substring(1, id.Length - 1)); if (x != 1 && x != 5 && x != 7 && x != 8) { throw new System.InvalidOperationException(); } _item[x] = value; } get { int x = int.Parse(id.Substring(1, id.Length - 1)); return _item[x]; } } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() B.Init(b!c9, 49) B.Init((b!c19), 59) With b B.Init(!c11, 51) B.Init((!c21), 61) End With for i as Integer = 0 To 35 System.Console.Write(b("c" & i)) System.Console.Write(" "c) Next End Sub End Class Class B Inherits C Public Sub New() Me!c1 = 41 With Me !c5 = 45 End With Init(Me!c7, 47) Init((Me!c23), 63) Dim b = Me Init(b!c12, 52) Init((b!c24), 64) With Me Init(!c8, 48) Init((!c26), 66) End With With b Init(!c14, 54) Init((!c27), 67) End With Test() Dim d = Sub() Init(Me!c34, 74) Init((Me!c35), 75) End Sub d() End Sub Public Sub Test() With Me Init(!c15, 55) Init((!c28), 68) End With Init(Me!c16, 56) Init((Me!c29), 69) Dim b = Me With b Init(!c18, 58) Init((!c31), 71) End With End Sub Public Shared Sub Init(ByRef p as Integer, val As Integer) p = val End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16_9, options:=TestOptions.DebugExe, references:={csCompilation}) CompileAndVerify(comp1, expectedOutput:="0 41 0 0 0 45 0 47 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0").VerifyDiagnostics() Dim comp2 = CreateCompilation(source1, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp2.AssertTheseDiagnostics( <expected><![CDATA[ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. B.Init(b!c9, 49) ~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. B.Init(!c11, 51) ~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Me!c1 = 41 ~~~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. !c5 = 45 ~~~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Me!c7, 47) ~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(b!c12, 52) ~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(!c8, 48) ~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(!c14, 54) ~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Me!c34, 74) ~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(!c15, 55) ~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(Me!c16, 56) ~~~~~~ BC36716: Visual Basic 16 does not support assigning to or passing 'ByRef' properties with init-only setters. Init(!c18, 58) ~~~~ ]]></expected>) Dim source3 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim x = new C() x!c0 = 40 With New B() !c2 = 42 End With Dim y As New B() With { .F = Sub() !c3 = 43 End Sub} End Sub End Class Class B Inherits C Public Sub New() Dim y = new B() With y !c4 = 44 End With With Me With y !c5 = 45 End With End With Dim x as New B() x!c6 = 46 Dim z = Sub() Me!c9 = 49 End Sub End Sub Public F As System.Action End Class ]]></file> </compilation> Dim comp3 = CreateCompilation(source3, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected3 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x!c0 = 40 ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. !c2 = 42 ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. !c3 = 43 ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. !c4 = 44 ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. !c5 = 45 ~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. x!c6 = 46 ~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me!c9 = 49 ~~~~~~~~~~ </expected> comp3.AssertTheseDiagnostics(expected3) Dim comp4 = CreateCompilation(source3, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp4.AssertTheseDiagnostics(expected3) Dim source5 = <compilation> <file name="c.vb"><![CDATA[ Class B Inherits C Public Sub Test() Me!c1 = 41 With Me !c5 = 45 End With End Sub End Class ]]></file> </compilation> Dim comp5 = CreateCompilation(source5, parseOptions:=TestOptions.RegularLatest, references:={csCompilation}) Dim expected5 = <expected> BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. Me!c1 = 41 ~~~~~~~~~~ BC37311: Init-only property 'Item' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. !c5 = 45 ~~~~~~~~ </expected> comp5.AssertTheseDiagnostics(expected5) Dim comp6 = CreateCompilation(source5, parseOptions:=TestOptions.Regular16, references:={csCompilation}) comp6.AssertTheseDiagnostics(expected5) End Sub <Fact()> <WorkItem(50327, "https://github.com/dotnet/roslyn/issues/50327")> Public Sub ModReqOnSetAccessorParameter() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig specialname newslot virtual instance void set_Property1 ( int32 modreq(System.Runtime.CompilerServices.IsExternalInit) 'value' ) cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32 Property1() { .set instance void C::set_Property1(int32 modreq(System.Runtime.CompilerServices.IsExternalInit)) } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Inherits C Public Overrides WriteOnly Property Property1 As Integer Set End Set End Property Sub M(c As C) c.Property1 = 42 c.set_Property1(43) End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30657: 'Property1' has a return type that is not supported or parameter types that are not supported. Set ~~~ BC30657: 'Property1' has a return type that is not supported or parameter types that are not supported. c.Property1 = 42 ~~~~~~~~~~~ BC30456: 'set_Property1' is not a member of 'C'. c.set_Property1(43) ~~~~~~~~~~~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.Property1") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.NotNull(pSet.GetUseSiteErrorInfo()) Assert.True(pSet.HasUnsupportedMetadata) Assert.Null(p.GetUseSiteErrorInfo()) Assert.False(p.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModReqOnSetAccessorParameter_AndProperty() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig specialname newslot virtual instance void set_Property1 ( int32 modreq(System.Runtime.CompilerServices.IsExternalInit) 'value' ) cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit) Property1() { .set instance void C::set_Property1(int32 modreq(System.Runtime.CompilerServices.IsExternalInit)) } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Inherits C Public Overrides WriteOnly Property Property1 As Integer Set End Set End Property Sub M(c As C) c.Property1 = 42 c.set_Property1(43) End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30643: Property 'C.Property1' is of an unsupported type. Public Overrides WriteOnly Property Property1 As Integer ~~~~~~~~~ BC30643: Property 'C.Property1' is of an unsupported type. c.Property1 = 42 ~~~~~~~~~ BC30456: 'set_Property1' is not a member of 'C'. c.set_Property1(43) ~~~~~~~~~~~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.Property1") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.NotNull(pSet.GetUseSiteErrorInfo()) Assert.True(pSet.HasUnsupportedMetadata) Assert.NotNull(p.GetUseSiteErrorInfo()) Assert.True(p.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModReqOnStaticMethod() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig static void modreq(System.Runtime.CompilerServices.IsExternalInit) M () cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Sub M() C.M() End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30657: 'M' has a return type that is not supported or parameter types that are not supported. C.M() ~ </expected>) Dim m = compilation.GetMember(Of MethodSymbol)("C.M") Assert.False(m.IsInitOnly) Assert.NotNull(m.GetUseSiteErrorInfo()) Assert.True(m.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModReqOnInstanceMethod() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig instance void modreq(System.Runtime.CompilerServices.IsExternalInit) M () cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Sub M(c As C) c.M() End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30657: 'M' has a return type that is not supported or parameter types that are not supported. c.M() ~ </expected>) Dim m = compilation.GetMember(Of MethodSymbol)("C.M") Assert.False(m.IsInitOnly) Assert.NotNull(m.GetUseSiteErrorInfo()) Assert.True(m.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModReqOnStaticSet() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig newslot specialname static void modreq(System.Runtime.CompilerServices.IsExternalInit) set_P(int32 x) cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32 P() { .set void modreq(System.Runtime.CompilerServices.IsExternalInit) C::set_P(int32) } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Sub M() C.P = 2 End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30657: 'P' has a return type that is not supported or parameter types that are not supported. C.P = 2 ~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.NotNull(pSet.GetUseSiteErrorInfo()) Assert.True(pSet.HasUnsupportedMetadata) Assert.Null(p.GetUseSiteErrorInfo()) Assert.False(p.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModReqOnSetterOfRefProperty() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig specialname newslot virtual instance int32& get_Property1 () cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname newslot virtual instance void set_Property1 ( int32& modreq(System.Runtime.CompilerServices.IsExternalInit) 'value' ) cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32& Property1() { .get instance int32& C::get_Property1() .set instance void C::set_Property1(int32& modreq(System.Runtime.CompilerServices.IsExternalInit)) } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Sub M(c As C, ByRef i as Integer) Dim x1 = c.get_Property1() c.set_Property(i) Dim x2 = c.Property1 c.Property1 = i End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30456: 'get_Property1' is not a member of 'C'. Dim x1 = c.get_Property1() ~~~~~~~~~~~~~~~ BC30456: 'set_Property' is not a member of 'C'. c.set_Property(i) ~~~~~~~~~~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.Property1") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.NotNull(pSet.GetUseSiteErrorInfo()) Assert.True(pSet.HasUnsupportedMetadata) Assert.Null(p.GetUseSiteErrorInfo()) Assert.False(p.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModReqOnRefProperty_OnRefReturn() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig specialname newslot virtual instance int32& modreq(System.Runtime.CompilerServices.IsExternalInit) get_Property1 () cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname newslot virtual instance void set_Property1 ( int32& modreq(System.Runtime.CompilerServices.IsExternalInit) 'value' ) cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32& modreq(System.Runtime.CompilerServices.IsExternalInit) Property1() { .get instance int32& modreq(System.Runtime.CompilerServices.IsExternalInit) C::get_Property1() .set instance void C::set_Property1(int32& modreq(System.Runtime.CompilerServices.IsExternalInit)) } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Sub M(c As C, ByRef i as Integer) Dim x1 = c.get_Property1() c.set_Property(i) Dim x2 = c.Property1 c.Property1 = i End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30456: 'get_Property1' is not a member of 'C'. Dim x1 = c.get_Property1() ~~~~~~~~~~~~~~~ BC30456: 'set_Property' is not a member of 'C'. c.set_Property(i) ~~~~~~~~~~~~~~ BC30643: Property 'C.Property1' is of an unsupported type. Dim x2 = c.Property1 ~~~~~~~~~ BC30643: Property 'C.Property1' is of an unsupported type. c.Property1 = i ~~~~~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.Property1") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.NotNull(pSet.GetUseSiteErrorInfo()) Assert.True(pSet.HasUnsupportedMetadata) Dim pGet = p.GetMethod Assert.False(pGet.IsInitOnly) Assert.NotNull(pGet.GetUseSiteErrorInfo()) Assert.True(pGet.HasUnsupportedMetadata) Assert.NotNull(p.GetUseSiteErrorInfo()) Assert.True(p.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModReqOnRefProperty_OnReturn() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig specialname newslot virtual instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit)& get_Property1 () cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname newslot virtual instance void set_Property1 ( int32 modreq(System.Runtime.CompilerServices.IsExternalInit)& 'value' ) cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit)& Property1() { .get instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit)& C::get_Property1() .set instance void C::set_Property1(int32 modreq(System.Runtime.CompilerServices.IsExternalInit)&) } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Sub M(c As C, ByRef i as Integer) Dim x1 = c.get_Property1() c.set_Property(i) Dim x2 = c.Property1 c.Property1 = i End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30456: 'get_Property1' is not a member of 'C'. Dim x1 = c.get_Property1() ~~~~~~~~~~~~~~~ BC30456: 'set_Property' is not a member of 'C'. c.set_Property(i) ~~~~~~~~~~~~~~ BC30643: Property 'C.Property1' is of an unsupported type. Dim x2 = c.Property1 ~~~~~~~~~ BC30643: Property 'C.Property1' is of an unsupported type. c.Property1 = i ~~~~~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.Property1") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.NotNull(pSet.GetUseSiteErrorInfo()) Assert.True(pSet.HasUnsupportedMetadata) Dim pGet = p.GetMethod Assert.False(pGet.IsInitOnly) Assert.NotNull(pGet.GetUseSiteErrorInfo()) Assert.True(pGet.HasUnsupportedMetadata) Assert.NotNull(p.GetUseSiteErrorInfo()) Assert.True(p.HasUnsupportedMetadata) End Sub <Fact()> <WorkItem(50327, "https://github.com/dotnet/roslyn/issues/50327")> Public Sub ModReqOnGetAccessorReturnValue() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig specialname newslot virtual instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit) get_Property1 () cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname newslot virtual instance void set_Property1 ( int32 'value' ) cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32 Property1() { .get instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit) C::get_Property1() .set instance void C::set_Property1(int32) } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Inherits C Overrides Property Property1 As Integer Sub M(c As C) Dim x1 = c.get_Property1() c.set_Property(1) Dim x2 = c.Property1 c.Property1 = 2 End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30657: 'Property1' has a return type that is not supported or parameter types that are not supported. Overrides Property Property1 As Integer ~~~~~~~~~ BC30456: 'get_Property1' is not a member of 'C'. Dim x1 = c.get_Property1() ~~~~~~~~~~~~~~~ BC30456: 'set_Property' is not a member of 'C'. c.set_Property(1) ~~~~~~~~~~~~~~ BC30657: 'Property1' has a return type that is not supported or parameter types that are not supported. Dim x2 = c.Property1 ~~~~~~~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.Property1") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.Null(pSet.GetUseSiteErrorInfo()) Assert.False(pSet.HasUnsupportedMetadata) Dim pGet = p.GetMethod Assert.False(pGet.IsInitOnly) Assert.NotNull(pGet.GetUseSiteErrorInfo()) Assert.True(pGet.HasUnsupportedMetadata) Assert.Null(p.GetUseSiteErrorInfo()) Assert.False(p.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModReqOnPropertyAndGetAccessorReturnValue() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig specialname newslot virtual instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit) get_Property1 () cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname newslot virtual instance void set_Property1 ( int32 'value' ) cil managed { IL_0000: ldnull IL_0001: throw } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit) Property1() { .get instance int32 modreq(System.Runtime.CompilerServices.IsExternalInit) C::get_Property1() .set instance void C::set_Property1(int32) } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Inherits C Overrides Property Property1 As Integer Sub M(c As C) Dim x1 = c.get_Property1() c.set_Property(1) Dim x2 = c.Property1 c.Property1 = 2 End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30643: Property 'C.Property1' is of an unsupported type. Overrides Property Property1 As Integer ~~~~~~~~~ BC30456: 'get_Property1' is not a member of 'C'. Dim x1 = c.get_Property1() ~~~~~~~~~~~~~~~ BC30456: 'set_Property' is not a member of 'C'. c.set_Property(1) ~~~~~~~~~~~~~~ BC30643: Property 'C.Property1' is of an unsupported type. Dim x2 = c.Property1 ~~~~~~~~~ BC30643: Property 'C.Property1' is of an unsupported type. c.Property1 = 2 ~~~~~~~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.Property1") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.Null(pSet.GetUseSiteErrorInfo()) Assert.False(pSet.HasUnsupportedMetadata) Dim pGet = p.GetMethod Assert.False(pGet.IsInitOnly) Assert.NotNull(pGet.GetUseSiteErrorInfo()) Assert.True(pGet.HasUnsupportedMetadata) Assert.NotNull(p.GetUseSiteErrorInfo()) Assert.True(p.HasUnsupportedMetadata) End Sub <Fact()> Public Sub ModOptOnSet() Dim ilSource = <![CDATA[ .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig newslot specialname instance void modopt(System.Runtime.CompilerServices.IsExternalInit) set_P(int32 x) cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32 P() { .set instance void modopt(System.Runtime.CompilerServices.IsExternalInit) C::set_P(int32) } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } .class public auto ansi sealed beforefieldinit System.Runtime.CompilerServices.IsExternalInit extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } ]]>.Value Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Shared Sub M(c As C) c.P = 2 End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) CompileAndVerify(compilation).VerifyDiagnostics() Dim p = compilation.GetMember(Of PropertySymbol)("C.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.Null(pSet.GetUseSiteErrorInfo()) Assert.False(pSet.HasUnsupportedMetadata) Assert.Null(p.GetUseSiteErrorInfo()) Assert.False(p.HasUnsupportedMetadata) End Sub <Theory, InlineData("Runtime.CompilerServices.IsExternalInit"), InlineData("CompilerServices.IsExternalInit"), InlineData("IsExternalInit"), InlineData("ns.System.Runtime.CompilerServices.IsExternalInit"), InlineData("system.Runtime.CompilerServices.IsExternalInit"), InlineData("System.runtime.CompilerServices.IsExternalInit"), InlineData("System.Runtime.compilerServices.IsExternalInit"), InlineData("System.Runtime.CompilerServices.isExternalInit") > Public Sub IsExternalInitCheck(modifierName As String) Dim ilSource = " .class public auto ansi beforefieldinit C extends System.Object { .method public hidebysig newslot specialname instance void modreq(" + modifierName + ") set_P(int32 x) cil managed { IL_0000: ldnull IL_0001: throw } .property instance int32 P() { .set instance void modreq(" + modifierName + ") C::set_P(int32) } .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } .class public auto ansi sealed beforefieldinit " + modifierName + " extends System.Object { .method public hidebysig specialname rtspecialname instance void .ctor () cil managed { IL_0000: ldnull IL_0001: throw } } " Dim vbSource = <compilation> <file name="c.vb"><![CDATA[ Class Test Sub M(c As C) c.P = 2 End Sub End Class ]]> </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(vbSource, ilSource, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.ReleaseDll) compilation.AssertTheseDiagnostics( <expected> BC30657: 'P' has a return type that is not supported or parameter types that are not supported. c.P = 2 ~~~ </expected>) Dim p = compilation.GetMember(Of PropertySymbol)("C.P") Dim pSet = p.SetMethod Assert.False(pSet.IsInitOnly) Assert.NotNull(pSet.GetUseSiteErrorInfo()) Assert.True(pSet.HasUnsupportedMetadata) Assert.Null(p.GetUseSiteErrorInfo()) Assert.False(p.HasUnsupportedMetadata) End Sub <Fact()> Public Sub IsInitOnlyValue() Dim vbSource1 = <compilation> <file name="c.vb"><![CDATA[ ]]> </file> </compilation> Dim compilation1 = CreateCompilation(vbSource1, options:=TestOptions.ReleaseDll) Dim vbSource2 = <compilation> <file name="c.vb"><![CDATA[ Class Test1(Of T) Public Shared Sub M1() Dim x as Integer = 0 x.DoSomething() End Sub Public Function M2() As System.Action return Sub() End Sub End Function Public Property P As Integer End Class Class Test2 Inherits Test1(Of Integer) End Class Delegate Sub D() Module Ext <System.Runtime.CompilerServices.Extension> Sub DoSomething(x As Integer) End Sub End Module ]]> </file> </compilation> Dim compilation2 = CreateCompilation(vbSource2, references:={compilation1.ToMetadataReference()}, options:=TestOptions.ReleaseDll) Dim tree = compilation2.SyntaxTrees.Single() Dim model = compilation2.GetSemanticModel(tree) Dim lambda = tree.GetRoot.DescendantNodes().OfType(Of LambdaExpressionSyntax)().Single() Assert.False(DirectCast(model.GetSymbolInfo(lambda).Symbol, MethodSymbol).IsInitOnly) Dim invocation = tree.GetRoot.DescendantNodes().OfType(Of InvocationExpressionSyntax)().Single() Assert.False(DirectCast(model.GetSymbolInfo(invocation).Symbol, MethodSymbol).IsInitOnly) Dim verify = Sub(compilation As VisualBasicCompilation) Dim test1 = compilation.GetTypeByMetadataName("Test1`1") Dim p = test1.GetMember(Of PropertySymbol)("P") Assert.False(p.SetMethod.IsInitOnly) Assert.False(p.GetMethod.IsInitOnly) Assert.False(test1.GetMember(Of MethodSymbol)("M1").IsInitOnly) Assert.False(test1.GetMember(Of MethodSymbol)("M2").IsInitOnly) Dim test1Constructed = compilation.GetTypeByMetadataName("Test2").BaseTypeNoUseSiteDiagnostics p = test1Constructed.GetMember(Of PropertySymbol)("P") Assert.False(p.SetMethod.IsInitOnly) Assert.False(p.GetMethod.IsInitOnly) Assert.False(test1Constructed.GetMember(Of MethodSymbol)("M1").IsInitOnly) Assert.False(test1Constructed.GetMember(Of MethodSymbol)("M2").IsInitOnly) Dim d = compilation.GetTypeByMetadataName("D") For Each m As MethodSymbol In d.GetMembers() Assert.False(m.IsInitOnly) Next End Sub verify(compilation2) Dim compilation3 = CreateCompilation(vbSource1, references:={compilation2.ToMetadataReference()}, options:=TestOptions.ReleaseDll) verify(compilation3) End Sub <Fact> Public Sub ReferenceConversion_01() Dim csSource = " public interface I1 { int P1 { get; init; } } public interface I2 {} public class C : I1, I2 { public int P0 { init; get; } int I1.P1 { get => P0; init => P0 = value; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.P0) End Sub End Class Class B Inherits C Public Sub New() DirectCast(Me, I1).P1 = 41 End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. DirectCast(Me, I1).P1 = 41 ~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_02() Dim csSource = " public interface I1 { int P1 { get; init; } } public interface I2 {} public class C : I1, I2 { public int P0 { init; get; } int I1.P1 { get => P0; init => P0 = value; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.P0) End Sub End Class Class B Inherits C Public Sub New() With CType(Me, I1) .P1 = 41 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .P1 = 41 ~~~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_03() Dim csSource = " public interface I1 { int P1 { get; init; } } public class C : I1 { public int P0 { init; get; } int I1.P1 { get => P0; init => P0 = value; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.P0) End Sub End Class Class B Inherits C Public Sub New() TryCast(Me, I1).P1 = 41 End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. TryCast(Me, I1).P1 = 41 ~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_04() Dim csSource = " public interface I1 { int P1 { get; init; } } public class C : I1 { public int P0 { init; get; } int I1.P1 { get => P0; init => P0 = value; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.P0) End Sub End Class Class B Inherits C Public Sub New() With TryCast(Me, I1) .P1 = 41 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .P1 = 41 ~~~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_05() Dim csSource = " public interface I1 { int P1 { get; init; } } public class C : I1 { public int P0 { init; get; } int I1.P1 { get => P0; init => P0 = value; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.P0) End Sub End Class Class B Inherits C Public Sub New() CType(MyBase, I1).P1 = 41 End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. CType(MyBase, I1).P1 = 41 ~~~~~~~~~~~~~~~~~~~~~~~~~ BC32027: 'MyBase' must be followed by '.' and an identifier. CType(MyBase, I1).P1 = 41 ~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_06() Dim csSource = " public interface I1 { int P1 { get; init; } } public class C : I1 { public int P0 { init; get; } int I1.P1 { get => P0; init => P0 = value; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.P0) End Sub End Class Class B Inherits C Public Sub New() DirectCast(MyClass, I1).P1 = 41 With MyClass .P0 = 1 End With With MyBase .P0 = 2 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. DirectCast(MyClass, I1).P1 = 41 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC32028: 'MyClass' must be followed by '.' and an identifier. DirectCast(MyClass, I1).P1 = 41 ~~~~~~~ BC32028: 'MyClass' must be followed by '.' and an identifier. With MyClass ~~~~~~~ BC32027: 'MyBase' must be followed by '.' and an identifier. With MyBase ~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_07() Dim csSource = " public class C { public int P0 { init; get; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() End Sub End Class Class B Inherits C Public Sub New() Me.P0 = 41 End Sub End Class Class D Public Shared Widening Operator CType(x As D) As B Return Nothing End Operator Public Sub New() CType(Me, B).P0 = 42 End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. CType(Me, B).P0 = 42 ~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_08() Dim csSource = " public class C { public int P0 { init; get; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.P0) End Sub End Class Class B Inherits C Public Sub New() DirectCast(Me, B).P0 = 41 End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. DirectCast(Me, B).P0 = 41 ~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_09() Dim csSource = " public class C { public int P0 { init; get; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() Dim b = new B() System.Console.Write(b.P0) End Sub End Class Class B Inherits C Public Sub New() With CType(Me, B) .P0 = 41 End With End Sub End Class ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC37311: Init-only property 'P0' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. .P0 = 41 ~~~~~~~~ </expected>) End Sub <Fact> Public Sub ReferenceConversion_10() Dim csSource = " public interface I1 { int P1 { get; init; } } " Dim csCompilation = CreateCSharpCompilation(csSource + IsExternalInitTypeDefinition).EmitToImageReference() Dim source1 = <compilation> <file name="c.vb"><![CDATA[ Public Class Test Shared Sub Main() End Sub End Class Structure B Implements I1 Public Sub New(x As Integer) DirectCast(Me, I1).P1 = 41 CType(Me, I1).P1 = 42 DirectCast(CObj(Me), I1).P1 = 43 End Sub End Structure ]]></file> </compilation> Dim comp1 = CreateCompilation(source1, parseOptions:=TestOptions.RegularLatest, options:=TestOptions.DebugExe, references:={csCompilation}) comp1.AssertTheseDiagnostics( <expected> BC30149: Structure 'B' must implement 'Property P1 As Integer' for interface 'I1'. Implements I1 ~~ BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. DirectCast(Me, I1).P1 = 41 ~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. CType(Me, I1).P1 = 42 ~~~~~~~~~~~~~~~~~~~~~ BC37311: Init-only property 'P1' can only be assigned by an object member initializer, or on 'Me', 'MyClass` or 'MyBase' in an instance constructor. DirectCast(CObj(Me), I1).P1 = 43 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub End Class End Namespace