/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Semantic/Semantics/Conversions.vb
5 187 строк
295 KB
Tomáš Matoušek
Refactoring of extension methods in source packages (#78620) - take 2 (#78894)
26 июн 2025, 18:42
Не верифицирован
26 июн 2025, 18:42
05fc006
Код
Авторство
О чём код?
' 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 Basic.Reference.Assemblies Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis.SpecialType Imports Microsoft.CodeAnalysis.VisualBasic Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics.ConversionsTests.Parameters Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Public Class ConversionsTests Inherits BasicTestBase Private Const s_noConversion As ConversionKind = Nothing <Fact()> Public Sub TryCastDirectCastConversions() Dim dummyCode = <file> Class C1 Shared Sub MethodDecl() End Sub End Class </file> Dim dummyTree = VisualBasicSyntaxTree.ParseText(dummyCode.Value) ' Tests are based on the source code used to compile VBConversions.dll, VBConversions.vb is ' checked in next to the DLL. Dim vbConversionsRef = TestReferences.SymbolsTests.VBConversions Dim modifiersRef = TestReferences.SymbolsTests.CustomModifiers.Modifiers.dll Dim c1 = VisualBasicCompilation.Create("Test", syntaxTrees:={dummyTree}, references:={Net40.References.mscorlib, vbConversionsRef, modifiersRef}) Dim sourceModule = DirectCast(c1.Assembly.Modules(0), SourceModuleSymbol) Dim methodDeclSymbol = DirectCast(sourceModule.GlobalNamespace.GetTypeMembers("C1").Single().GetMembers("MethodDecl").Single(), SourceMethodSymbol) Dim methodBodyBinder = BinderBuilder.CreateBinderForMethodBody(sourceModule, dummyTree, methodDeclSymbol) Dim asmVBConversions = c1.GetReferencedAssemblySymbol(vbConversionsRef) Dim asmModifiers = c1.GetReferencedAssemblySymbol(modifiersRef) Dim test = asmVBConversions.Modules(0).GlobalNamespace.GetTypeMembers("Test").Single() Dim m13 = DirectCast(test.GetMembers("M13").Single(), MethodSymbol) Dim m13p = m13.Parameters.Select(Function(p) p.Type).ToArray() Assert.Equal(ConversionKind.WideningReference, ClassifyDirectCastAssignment(m13p(a), m13p(b), methodBodyBinder)) ' Object) Assert.Equal(ConversionKind.WideningValue, ClassifyDirectCastAssignment(m13p(a), m13p(c), methodBodyBinder)) ' Object) Assert.Equal(ConversionKind.NarrowingReference, ClassifyDirectCastAssignment(m13p(b), m13p(a), methodBodyBinder)) ' ValueType) Assert.Equal(ConversionKind.WideningValue, ClassifyDirectCastAssignment(m13p(b), m13p(c), methodBodyBinder)) ' ValueType) Assert.Equal(ConversionKind.NarrowingValue, ClassifyDirectCastAssignment(m13p(c), m13p(a), methodBodyBinder)) ' Integer) Assert.Equal(ConversionKind.NarrowingValue, ClassifyDirectCastAssignment(m13p(c), m13p(b), methodBodyBinder)) ' Integer) Assert.True(Conversions.IsIdentityConversion(ClassifyDirectCastAssignment(m13p(c), m13p(c), methodBodyBinder))) ' Integer) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(c), m13p(d), methodBodyBinder)) ' Integer) 'error BC30311: Value of type 'Long' cannot be converted to 'Integer'. Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyDirectCastAssignment(m13p(c), m13p(e), methodBodyBinder)) ' Integer) Assert.True(Conversions.IsIdentityConversion(ClassifyDirectCastAssignment(m13p(d), m13p(d), methodBodyBinder))) ' Long) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(d), m13p(c), methodBodyBinder)) ' Long) 'error BC30311: Value of type 'Integer' cannot be converted to 'Long'. Assert.True(Conversions.IsIdentityConversion(ClassifyDirectCastAssignment(m13p(e), m13p(e), methodBodyBinder))) ' Enum1) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(e), m13p(f), methodBodyBinder)) ' Enum1) 'error BC30311: Value of type 'Enum2' cannot be converted to 'Enum1'. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyDirectCastAssignment(m13p(e), m13p(g), methodBodyBinder)) ' Enum1) Assert.True(Conversions.IsIdentityConversion(ClassifyDirectCastAssignment(m13p(f), m13p(f), methodBodyBinder))) ' Enum2) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(f), m13p(g), methodBodyBinder)) ' Enum2) ' error BC30311: Value of type 'Enum4' cannot be converted to 'Enum2'. Assert.Equal(ConversionKind.WideningArray, ClassifyDirectCastAssignment(m13p(h), m13p(i), methodBodyBinder)) ' Class8()) Assert.Equal(ConversionKind.NarrowingArray, ClassifyDirectCastAssignment(m13p(i), m13p(h), methodBodyBinder)) ' Class9()) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(i), m13p(j), methodBodyBinder)) ' Class9()) ' error BC30332: Value of type '1-dimensional array of Class11' cannot be converted to '1-dimensional array of Class9' because 'Class11' is not derived from 'Class9'. Assert.True(Conversions.IsIdentityConversion(ClassifyDirectCastAssignment(m13p(k), m13p(k), methodBodyBinder))) ' MT1) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(k), m13p(l), methodBodyBinder)) ' MT1) ' error BC30311: Value of type 'MT2' cannot be converted to 'MT1'. Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyDirectCastAssignment(m13p(k), m13p(m), methodBodyBinder)) ' MT1) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(k), m13p(q), methodBodyBinder)) ' MT1) ' error BC30311: Value of type 'MT4' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(l), m13p(k), methodBodyBinder)) ' MT2) ' Value of type 'MT1' cannot be converted to 'MT2'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyDirectCastAssignment(m13p(m), m13p(k), methodBodyBinder)) ' MT3) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(n), m13p(o), methodBodyBinder)) ' MT1()) ' Value of type '1-dimensional array of MT2' cannot be converted to '1-dimensional array of MT1' because 'MT2' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(n), m13p(p), methodBodyBinder)) ' MT1()) ' error BC30332: Value of type '2-dimensional array of MT2' cannot be converted to '1-dimensional array of MT1' because 'MT2' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(n), m13p(u), methodBodyBinder)) ' MT1()) ' error BC30332: Value of type '1-dimensional array of Integer' cannot be converted to '1-dimensional array of MT1' because 'Integer' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(q), m13p(k), methodBodyBinder)) ' MT4) ' error BC30311: Value of type 'MT1' cannot be converted to 'MT4'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(q), m13p(b), methodBodyBinder)) ' MT4) ' error BC30311: Value of type 'System.ValueType' cannot be converted Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(q), m13p(c), methodBodyBinder)) ' MT4) ' error BC30311: Value of type 'Integer' cannot be converted to 'MT4' Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(r), m13p(s), methodBodyBinder)) ' MT5) ' error BC30311: Value of type 'MT6' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(r), m13p(t), methodBodyBinder)) ' MT5) ' error BC30311: Value of type 'MT7' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(r), m13p(w), methodBodyBinder)) ' MT5) ' error BC30311: Value of type 'MT8' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(s), m13p(r), methodBodyBinder)) ' MT6) ' error BC30311: Value of type 'MT5' cannot be converted to 'MT6'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(s), m13p(t), methodBodyBinder)) ' MT6) ' error BC30311: Value of type 'MT7' cannot be converted to 'MT6'. Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyDirectCastAssignment(m13p(s), m13p(w), methodBodyBinder)) ' MT6) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(t), m13p(r), methodBodyBinder)) ' MT7) ' error BC30311: Value of type 'MT5' cannot be converted to 'MT7'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(t), m13p(s), methodBodyBinder)) ' MT7) ' error BC30311: Value of type 'MT6' cannot be converted to 'MT7'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(t), m13p(w), methodBodyBinder)) ' MT7) ' error BC30311: Value of type 'MT8' cannot be converted to 'MT7'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(u), m13p(n), methodBodyBinder)) ' Integer()) 'error BC30332: Value of type '1-dimensional array of MT1' cannot be converted to '1-dimensional array of Integer' because 'MT1' is not derived from 'Integer'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(u), m13p(v), methodBodyBinder)) ' Integer()) 'error BC30332: Value of type '1-dimensional array of MT4' cannot be converted to '1-dimensional array of Integer' because 'MT4' is not derived from 'Integer'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(v), m13p(u), methodBodyBinder)) ' MT4()) 'error BC30332: Value of type '1-dimensional array of Integer' cannot be converted to '1-dimensional array of MT4' because 'Integer' is not derived from 'MT4'. Dim [nothing] = New BoundLiteral(DirectCast(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), VisualBasicSyntaxNode), ConstantValue.Nothing, Nothing) Dim intZero = New BoundLiteral(DirectCast(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), VisualBasicSyntaxNode), ConstantValue.Create(0I), m13p(c)) Dim longZero = New BoundLiteral(DirectCast(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), VisualBasicSyntaxNode), ConstantValue.Create(0L), m13p(d)) Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyDirectCastAssignment(m13p(a), [nothing], methodBodyBinder)) Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyDirectCastAssignment(m13p(b), [nothing], methodBodyBinder)) Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyDirectCastAssignment(m13p(c), [nothing], methodBodyBinder)) Assert.True(Conversions.IsIdentityConversion(ClassifyDirectCastAssignment(m13p(c), intZero, methodBodyBinder))) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(c), longZero, methodBodyBinder)) 'error BC30311: Value of type 'Long' cannot be converted to 'Integer'. Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(d), intZero, methodBodyBinder)) ' error BC30311: Value of type 'Integer' cannot be converted to 'Long'. Assert.True(Conversions.IsIdentityConversion(ClassifyDirectCastAssignment(m13p(d), longZero, methodBodyBinder))) Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyDirectCastAssignment(m13p(e), intZero, methodBodyBinder)) Assert.Equal(s_noConversion, ClassifyDirectCastAssignment(m13p(e), longZero, methodBodyBinder)) ' error BC30311: Value of type 'Long' cannot be converted to 'Enum1'. Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyDirectCastAssignment(m13p(e), [nothing], methodBodyBinder)) Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyDirectCastAssignment(m13p(k), [nothing], methodBodyBinder)) Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyDirectCastAssignment(m13p(q), [nothing], methodBodyBinder)) Assert.Equal(ConversionKind.WideningReference, ClassifyTryCastAssignment(m13p(a), m13p(b), methodBodyBinder)) ' Object) Assert.Equal(ConversionKind.WideningValue, ClassifyTryCastAssignment(m13p(a), m13p(c), methodBodyBinder)) ' Object) Assert.Equal(ConversionKind.NarrowingReference, ClassifyTryCastAssignment(m13p(b), m13p(a), methodBodyBinder)) ' ValueType) Assert.Equal(ConversionKind.WideningValue, ClassifyTryCastAssignment(m13p(b), m13p(c), methodBodyBinder)) ' ValueType) Assert.Equal(ConversionKind.NarrowingValue, ClassifyTryCastAssignment(m13p(c), m13p(a), methodBodyBinder)) ' Integer) ' error BC30792: 'TryCast' operand must be reference type, but 'Integer' is a value type. Assert.Equal(ConversionKind.NarrowingValue, ClassifyTryCastAssignment(m13p(c), m13p(b), methodBodyBinder)) ' Integer) ' error BC30792: 'TryCast' operand must be reference type, but 'Integer' is a value type. Assert.Equal(ConversionKind.Identity, ClassifyTryCastAssignment(m13p(c), m13p(c), methodBodyBinder)) ' Integer) ' error BC30792: 'TryCast' operand must be reference type, but 'Integer' is a value type. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(c), m13p(d), methodBodyBinder)) ' Integer) ' error BC30792: 'TryCast' operand must be reference type, but 'Integer' is a value type. Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyTryCastAssignment(m13p(c), m13p(e), methodBodyBinder)) ' Integer) ' error BC30792: 'TryCast' operand must be reference type, but 'Integer' is a value type. Assert.Equal(ConversionKind.Identity, ClassifyTryCastAssignment(m13p(d), m13p(d), methodBodyBinder)) ' Long) ' error BC30792: 'TryCast' operand must be reference type, but 'Long' is a value type. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(d), m13p(c), methodBodyBinder)) ' Long) ' error BC30792: 'TryCast' operand must be reference type, but 'Long' is a value type. Assert.Equal(ConversionKind.Identity, ClassifyTryCastAssignment(m13p(e), m13p(e), methodBodyBinder)) ' Enum1) ' error BC30792: 'TryCast' operand must be reference type, but 'Enum1' is a value type. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(e), m13p(f), methodBodyBinder)) ' Enum1) ' error BC30792: 'TryCast' operand must be reference type, but 'Enum1' is a value type. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyTryCastAssignment(m13p(e), m13p(g), methodBodyBinder)) ' Enum1) ' error BC30792: 'TryCast' operand must be reference type, but 'Enum1' is a value type. Assert.Equal(ConversionKind.Identity, ClassifyTryCastAssignment(m13p(f), m13p(f), methodBodyBinder)) ' Enum2) ' error BC30792: 'TryCast' operand must be reference type, but 'Enum2' is a value type. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(f), m13p(g), methodBodyBinder)) ' Enum2) ' error BC30792: 'TryCast' operand must be reference type, but 'Enum2' is a value type. Assert.Equal(ConversionKind.WideningArray, ClassifyTryCastAssignment(m13p(h), m13p(i), methodBodyBinder)) ' Class8()) Assert.Equal(ConversionKind.NarrowingArray, ClassifyTryCastAssignment(m13p(i), m13p(h), methodBodyBinder)) ' Class9()) Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(i), m13p(j), methodBodyBinder)) ' Class9()) ' error BC30332: Value of type '1-dimensional array of Class11' cannot be converted to '1-dimensional array of Class9' because 'Class11' is not derived from 'Class9'. Assert.Equal(ConversionKind.Identity, ClassifyTryCastAssignment(m13p(k), m13p(k), methodBodyBinder)) ' MT1) ' error BC30793: 'TryCast' operands must be class-constrained type parameter, but 'MT1' has no class constraint. Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(k), m13p(l), methodBodyBinder)) ' MT1) ' error BC30793: 'TryCast' operands must be class-constrained type parameter, but 'MT1' has no class constraint. Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyTryCastAssignment(m13p(k), m13p(m), methodBodyBinder)) ' MT1) ' error BC30793: 'TryCast' operands must be class-constrained type parameter, but 'MT1' has no class constraint. Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(k), m13p(q), methodBodyBinder)) ' MT1) ' error BC30793: 'TryCast' operands must be class-constrained type parameter, but 'MT1' has no class constraint. Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(l), m13p(k), methodBodyBinder)) ' MT2) ' error BC30793: 'TryCast' operands must be class-constrained type parameter, but 'MT2' has no class constraint. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyTryCastAssignment(m13p(m), m13p(k), methodBodyBinder)) ' MT3) ' error BC30793: 'TryCast' operands must be class-constrained type parameter, but 'MT3' has no class constraint. Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(n), m13p(o), methodBodyBinder)) ' MT1()) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(n), m13p(p), methodBodyBinder)) ' MT1()) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(n), m13p(u), methodBodyBinder)) ' MT1()) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(q), m13p(k), methodBodyBinder)) ' MT4) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(q), m13p(b), methodBodyBinder)) ' MT4) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(q), m13p(c), methodBodyBinder)) ' MT4) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(r), m13p(s), methodBodyBinder)) ' MT5) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(r), m13p(t), methodBodyBinder)) ' MT5) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(r), m13p(w), methodBodyBinder)) ' MT5) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(s), m13p(r), methodBodyBinder)) ' MT6) Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(s), m13p(t), methodBodyBinder)) ' MT6) ' error BC30311: Value of type 'MT7' cannot be converted to 'MT6'. Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyTryCastAssignment(m13p(s), m13p(w), methodBodyBinder)) ' MT6) Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(t), m13p(r), methodBodyBinder)) ' MT7) Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(t), m13p(s), methodBodyBinder)) ' MT7) ' error BC30311: Value of type 'MT6' cannot be converted to 'MT7'. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(t), m13p(w), methodBodyBinder)) ' MT7) ' error BC30311: Value of type 'MT8' cannot be converted to 'MT7'. Assert.Equal(ConversionKind.Narrowing, ClassifyTryCastAssignment(m13p(u), m13p(n), methodBodyBinder)) ' Integer()) Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(u), m13p(v), methodBodyBinder)) ' Integer()) 'error BC30332: Value of type '1-dimensional array of MT4' cannot be converted to '1-dimensional array of Integer' because 'MT4' is not derived from 'Integer'. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(v), m13p(u), methodBodyBinder)) ' MT4()) 'error BC30332: Value of type '1-dimensional array of Integer' cannot be converted to '1-dimensional array of MT4' because 'Integer' is not derived from 'MT4'. Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyTryCastAssignment(m13p(a), [nothing], methodBodyBinder)) Assert.Equal(ConversionKind.WideningValue, ClassifyTryCastAssignment(m13p(a), intZero, methodBodyBinder)) Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyTryCastAssignment(m13p(b), [nothing], methodBodyBinder)) Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyTryCastAssignment(m13p(c), [nothing], methodBodyBinder)) ' error BC30792: 'TryCast' operand must be reference type, but 'Integer' is a value type. Assert.Equal(ConversionKind.Identity, ClassifyTryCastAssignment(m13p(c), intZero, methodBodyBinder)) ' error BC30792: 'TryCast' operand must be reference type, but 'Integer' is a value type. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(c), longZero, methodBodyBinder)) ' error BC30792: 'TryCast' operand must be reference type, but 'Integer' is a value type. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(d), intZero, methodBodyBinder)) ' error BC30792: 'TryCast' operand must be reference type, but 'Long' is a value type. Assert.Equal(ConversionKind.Identity, ClassifyTryCastAssignment(m13p(d), longZero, methodBodyBinder)) ' error BC30792: 'TryCast' operand must be reference type, but 'Long' is a value type. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyTryCastAssignment(m13p(e), intZero, methodBodyBinder)) ' error BC30792: 'TryCast' operand must be reference type, but 'Enum1' is a value type. Assert.Equal(s_noConversion, ClassifyTryCastAssignment(m13p(e), longZero, methodBodyBinder)) ' error BC30792: 'TryCast' operand must be reference type, but 'Enum1' is a value type. Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyTryCastAssignment(m13p(e), [nothing], methodBodyBinder)) ' error BC30792: 'TryCast' operand must be reference type, but 'Enum1' is a value type. Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyTryCastAssignment(m13p(k), [nothing], methodBodyBinder)) ' error BC30793: 'TryCast' operands must be class-constrained type parameter, but 'MT1' has no class constraint. Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyTryCastAssignment(m13p(q), [nothing], methodBodyBinder)) End Sub Private Shared Function ClassifyDirectCastAssignment([to] As TypeSymbol, [from] As TypeSymbol, binder As Binder) As ConversionKind Dim result As ConversionKind = Conversions.ClassifyDirectCastConversion([from], [to], Nothing) And Not ConversionKind.MightSucceedAtRuntime Return result End Function Private Shared Function ClassifyDirectCastAssignment([to] As TypeSymbol, [from] As BoundLiteral, binder As Binder) As ConversionKind Dim result As ConversionKind = Conversions.ClassifyDirectCastConversion([from], [to], binder, Nothing) Return result End Function Private Shared Function ClassifyTryCastAssignment([to] As TypeSymbol, [from] As TypeSymbol, binder As Binder) As ConversionKind Dim result As ConversionKind = Conversions.ClassifyTryCastConversion([from], [to], Nothing) Return result End Function Private Shared Function ClassifyTryCastAssignment([to] As TypeSymbol, [from] As BoundLiteral, binder As Binder) As ConversionKind Dim result As ConversionKind = Conversions.ClassifyTryCastConversion([from], [to], binder, Nothing) Return result End Function Private Shared Function ClassifyConversion(source As TypeSymbol, destination As TypeSymbol) As ConversionKind Dim result As KeyValuePair(Of ConversionKind, MethodSymbol) = Conversions.ClassifyConversion(source, destination, Nothing) Assert.Null(result.Value) Return result.Key End Function Private Shared Function ClassifyConversion(source As BoundExpression, destination As TypeSymbol, binder As Binder) As ConversionKind Dim result As KeyValuePair(Of ConversionKind, MethodSymbol) = Conversions.ClassifyConversion(source, destination, binder, Nothing) Assert.Null(result.Value) Return result.Key End Function <Fact()> Public Sub ConstantExpressionConversions() Dim dummyCode = <file> Class C1 Shared Sub MethodDecl() End Sub End Class </file> Dim dummyTree = VisualBasicSyntaxTree.ParseText(dummyCode.Value) Dim c1 = VisualBasicCompilation.Create("Test", syntaxTrees:={dummyTree}, references:={Net40.References.mscorlib}) Dim sourceModule = DirectCast(c1.Assembly.Modules(0), SourceModuleSymbol) Dim methodDeclSymbol = DirectCast(sourceModule.GlobalNamespace.GetTypeMembers("C1").Single().GetMembers("MethodDecl").Single(), SourceMethodSymbol) Dim methodBodyBinder = BinderBuilder.CreateBinderForMethodBody(sourceModule, dummyTree, methodDeclSymbol) Assert.True(c1.Options.CheckOverflow) Dim objectType = c1.GetSpecialType(System_Object) Dim booleanType = c1.GetSpecialType(System_Boolean) Dim byteType = c1.GetSpecialType(System_Byte) Dim sbyteType = c1.GetSpecialType(System_SByte) Dim int16Type = c1.GetSpecialType(System_Int16) Dim uint16Type = c1.GetSpecialType(System_UInt16) Dim int32Type = c1.GetSpecialType(System_Int32) Dim uint32Type = c1.GetSpecialType(System_UInt32) Dim int64Type = c1.GetSpecialType(System_Int64) Dim uint64Type = c1.GetSpecialType(System_UInt64) Dim doubleType = c1.GetSpecialType(System_Double) Dim singleType = c1.GetSpecialType(System_Single) Dim decimalType = c1.GetSpecialType(System_Decimal) Dim dateType = c1.GetSpecialType(System_DateTime) Dim stringType = c1.GetSpecialType(System_String) Dim charType = c1.GetSpecialType(System_Char) Dim intPtrType = c1.GetSpecialType(System_IntPtr) Dim typeCodeType = c1.GlobalNamespace.GetMembers("System").OfType(Of NamespaceSymbol)().Single().GetTypeMembers("TypeCode").Single() Dim allTestTypes = New TypeSymbol() { objectType, booleanType, byteType, sbyteType, int16Type, uint16Type, int32Type, uint32Type, int64Type, uint64Type, doubleType, singleType, decimalType, dateType, stringType, charType, intPtrType, typeCodeType} Dim convertibleTypes = New HashSet(Of TypeSymbol)({ booleanType, byteType, sbyteType, int16Type, uint16Type, int32Type, uint32Type, int64Type, uint64Type, doubleType, singleType, decimalType, dateType, stringType, charType, typeCodeType}) Dim integralTypes = New HashSet(Of TypeSymbol)({ byteType, sbyteType, int16Type, uint16Type, int32Type, uint32Type, int64Type, uint64Type, typeCodeType}) Dim unsignedTypes = New HashSet(Of TypeSymbol)({ byteType, uint16Type, uint32Type, uint64Type}) Dim numericTypes = New HashSet(Of TypeSymbol)({ byteType, sbyteType, int16Type, uint16Type, int32Type, uint32Type, int64Type, uint64Type, doubleType, singleType, decimalType, typeCodeType}) Dim floatingTypes = New HashSet(Of TypeSymbol)({doubleType, singleType}) ' -------------- NOTHING literal conversions Dim _nothing = New BoundLiteral(DirectCast(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), VisualBasicSyntaxNode), ConstantValue.Nothing, Nothing) Dim resultValue As ConstantValue Dim integerOverflow As Boolean Dim literal As BoundExpression Dim constant As BoundConversion For Each testType In allTestTypes Assert.Equal(ConversionKind.WideningNothingLiteral, ClassifyConversion(_nothing, testType, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(_nothing, testType, integerOverflow) If convertibleTypes.Contains(testType) Then Assert.NotNull(resultValue) Assert.Equal(If(testType.IsStringType(), ConstantValueTypeDiscriminator.Nothing, testType.GetConstantValueTypeDiscriminator()), resultValue.Discriminator) If testType IsNot dateType Then Assert.Equal(0, Convert.ToInt64(resultValue.Value)) If testType Is stringType Then Assert.Null(resultValue.StringValue) End If Else Assert.Equal(New DateTime(), resultValue.DateTimeValue) End If Else Assert.Null(resultValue) End If Assert.False(integerOverflow) If resultValue IsNot Nothing Then Assert.False(resultValue.IsBad) End If Next ' -------------- integer literal zero to enum conversions For Each integralType In integralTypes Dim zero = ConstantValue.Default(integralType.GetConstantValueTypeDiscriminator()) literal = New BoundLiteral(DirectCast(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), VisualBasicSyntaxNode), zero, integralType) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), literal, ConversionKind.Widening, True, True, zero, integralType, Nothing) Assert.Equal(If(integralType Is int32Type, ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, If(integralType Is typeCodeType, ConversionKind.Identity, ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions)), ClassifyConversion(literal, typeCodeType, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, typeCodeType, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.Equal(ConstantValueTypeDiscriminator.Int32, resultValue.Discriminator) Assert.Equal(0, resultValue.Int32Value) Assert.Equal(If(integralType Is typeCodeType, ConversionKind.Identity, ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions), ClassifyConversion(constant, typeCodeType, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(constant, typeCodeType, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.Equal(ConstantValueTypeDiscriminator.Int32, resultValue.Discriminator) Assert.Equal(0, resultValue.Int32Value) Next For Each convertibleType In convertibleTypes If Not integralTypes.Contains(convertibleType) Then Dim zero = ConstantValue.Default(If(convertibleType.IsStringType(), ConstantValueTypeDiscriminator.Nothing, convertibleType.GetConstantValueTypeDiscriminator())) If convertibleType.IsStringType() Then literal = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(DirectCast(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), VisualBasicSyntaxNode), ConstantValue.Null, Nothing), ConversionKind.WideningNothingLiteral, False, True, zero, convertibleType, Nothing) Else literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), zero, convertibleType) End If Assert.Equal(ClassifyConversion(convertibleType, typeCodeType), ClassifyConversion(literal, typeCodeType, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, typeCodeType, integerOverflow) If Not numericTypes.Contains(convertibleType) AndAlso convertibleType IsNot booleanType Then Assert.Null(resultValue) Assert.False(integerOverflow) Else Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.Equal(ConstantValueTypeDiscriminator.Int32, resultValue.Discriminator) Assert.Equal(0, resultValue.Int32Value) End If End If Next ' -------------- Numeric conversions Dim nullableType = c1.GetSpecialType(System_Nullable_T) ' Zero For Each type1 In convertibleTypes Dim zero = ConstantValue.Default(If(type1.IsStringType(), ConstantValueTypeDiscriminator.Nothing, type1.GetConstantValueTypeDiscriminator())) If type1.IsStringType() Then literal = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), ConstantValue.Null, Nothing), ConversionKind.WideningNothingLiteral, False, True, zero, type1, Nothing) Else literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), zero, type1) End If constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Default(ConstantValueTypeDiscriminator.Int32), int32Type), ConversionKind.Widening, True, True, zero, type1, Nothing) For Each type2 In allTestTypes Dim expectedConv As ConversionKind If numericTypes.Contains(type1) AndAlso numericTypes.Contains(type2) Then If type1 Is type2 Then expectedConv = ConversionKind.Identity ElseIf type1.IsEnumType() Then expectedConv = ClassifyConversion(type1.GetEnumUnderlyingTypeOrSelf(), type2) If Conversions.IsWideningConversion(expectedConv) Then expectedConv = expectedConv Or ConversionKind.InvolvesEnumTypeConversions If (expectedConv And ConversionKind.Identity) <> 0 Then expectedConv = (expectedConv And Not ConversionKind.Identity) Or ConversionKind.Widening Or ConversionKind.Numeric End If ElseIf Conversions.IsNarrowingConversion(expectedConv) Then expectedConv = expectedConv Or ConversionKind.InvolvesEnumTypeConversions End If ElseIf type2.IsEnumType() Then expectedConv = ClassifyConversion(type1, type2.GetEnumUnderlyingTypeOrSelf()) If Not Conversions.NoConversion(expectedConv) Then expectedConv = (expectedConv And Not ConversionKind.Widening) Or ConversionKind.Narrowing Or ConversionKind.InvolvesEnumTypeConversions If (expectedConv And ConversionKind.Identity) <> 0 Then expectedConv = (expectedConv And Not ConversionKind.Identity) Or ConversionKind.Numeric End If End If ElseIf integralTypes.Contains(type2) Then If integralTypes.Contains(type1) Then If Conversions.IsNarrowingConversion(ClassifyConversion(type1, type2)) Then expectedConv = ConversionKind.WideningNumeric Or ConversionKind.InvolvesNarrowingFromNumericConstant Else expectedConv = ConversionKind.WideningNumeric End If Else expectedConv = ConversionKind.NarrowingNumeric End If ElseIf floatingTypes.Contains(type2) Then If Conversions.IsNarrowingConversion(ClassifyConversion(type1, type2)) Then expectedConv = ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesNarrowingFromNumericConstant Else expectedConv = ConversionKind.WideningNumeric End If Else Assert.Same(decimalType, type2) expectedConv = ClassifyConversion(type1, type2) End If Assert.Equal(If(type2.IsEnumType() AndAlso type1 Is int32Type, ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, expectedConv), ClassifyConversion(literal, type2, methodBodyBinder)) Assert.Equal(expectedConv, ClassifyConversion(constant, type2, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, type2, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(type2.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.Equal(0, Convert.ToDouble(resultValue.Value)) resultValue = Conversions.TryFoldConstantConversion(constant, type2, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(type2.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.Equal(0, Convert.ToDouble(resultValue.Value)) Dim nullableType2 = nullableType.Construct(type2) expectedConv = ClassifyConversion(type1, nullableType2) Or (expectedConv And ConversionKind.InvolvesNarrowingFromNumericConstant) If type2.IsEnumType() AndAlso type1.SpecialType = SpecialType.System_Int32 Then Assert.Equal(expectedConv Or ConversionKind.InvolvesNarrowingFromNumericConstant, ClassifyConversion(literal, nullableType2, methodBodyBinder)) Else Assert.Equal(expectedConv, ClassifyConversion(literal, nullableType2, methodBodyBinder)) End If Assert.Equal(expectedConv, ClassifyConversion(constant, nullableType2, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, nullableType2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) resultValue = Conversions.TryFoldConstantConversion(constant, nullableType2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) ElseIf type1 Is booleanType AndAlso numericTypes.Contains(type2) Then ' Will test separately Continue For ElseIf type2 Is booleanType AndAlso numericTypes.Contains(type1) Then Assert.Equal(If(type1 Is typeCodeType, ConversionKind.NarrowingBoolean Or ConversionKind.InvolvesEnumTypeConversions, ConversionKind.NarrowingBoolean), ClassifyConversion(literal, type2, methodBodyBinder)) Assert.Equal(If(type1 Is typeCodeType, ConversionKind.NarrowingBoolean Or ConversionKind.InvolvesEnumTypeConversions, ConversionKind.NarrowingBoolean), ClassifyConversion(constant, type2, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, type2, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(type2.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.False(DirectCast(resultValue.Value, Boolean)) resultValue = Conversions.TryFoldConstantConversion(constant, type2, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(type2.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.False(DirectCast(resultValue.Value, Boolean)) ElseIf type1 Is stringType AndAlso type2 Is charType Then ' Will test separately Continue For ElseIf type1 Is charType AndAlso type2 Is stringType Then ' Will test separately Continue For ElseIf type2 Is typeCodeType AndAlso integralTypes.Contains(type1) Then ' Already tested Continue For ElseIf (type1 Is dateType AndAlso type2 Is dateType) OrElse (type1 Is booleanType AndAlso type2 Is booleanType) OrElse (type1 Is stringType AndAlso type2 Is stringType) OrElse (type1 Is charType AndAlso type2 Is charType) Then Assert.True(Conversions.IsIdentityConversion(ClassifyConversion(literal, type2, methodBodyBinder))) Assert.True(Conversions.IsIdentityConversion(ClassifyConversion(constant, type2, methodBodyBinder))) resultValue = Conversions.TryFoldConstantConversion(literal, type2, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.True(type2.IsValidForConstantValue(resultValue)) Assert.Equal(literal.ConstantValueOpt, resultValue) resultValue = Conversions.TryFoldConstantConversion(constant, type2, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.True(type2.IsValidForConstantValue(resultValue)) Assert.Equal(constant.ConstantValueOpt, resultValue) Else Dim expectedConv1 As KeyValuePair(Of ConversionKind, MethodSymbol) = Conversions.ClassifyConversion(type1, type2, Nothing) Assert.Equal(expectedConv1, Conversions.ClassifyConversion(literal, type2, methodBodyBinder, Nothing)) Assert.Equal(expectedConv1, Conversions.ClassifyConversion(constant, type2, methodBodyBinder, Nothing)) resultValue = Conversions.TryFoldConstantConversion(literal, type2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) resultValue = Conversions.TryFoldConstantConversion(constant, type2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) If type2.IsValueType Then Dim nullableType2 = nullableType.Construct(type2) expectedConv1 = Conversions.ClassifyConversion(type1, nullableType2, Nothing) Assert.Equal(expectedConv1, Conversions.ClassifyConversion(literal, nullableType2, methodBodyBinder, Nothing)) Assert.Equal(expectedConv1, Conversions.ClassifyConversion(constant, nullableType2, methodBodyBinder, Nothing)) resultValue = Conversions.TryFoldConstantConversion(literal, nullableType2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) resultValue = Conversions.TryFoldConstantConversion(constant, nullableType2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) End If End If Next Next ' -------- Numeric non-zero values Dim nonZeroValues = New TypeAndValue() { New TypeAndValue(sbyteType, SByte.MinValue), New TypeAndValue(int16Type, Int16.MinValue), New TypeAndValue(int32Type, Int32.MinValue), New TypeAndValue(int64Type, Int64.MinValue), New TypeAndValue(doubleType, Double.MinValue), New TypeAndValue(singleType, Single.MinValue), New TypeAndValue(decimalType, Decimal.MinValue), New TypeAndValue(sbyteType, SByte.MaxValue), New TypeAndValue(int16Type, Int16.MaxValue), New TypeAndValue(int32Type, Int32.MaxValue), New TypeAndValue(int64Type, Int64.MaxValue), New TypeAndValue(byteType, Byte.MaxValue), New TypeAndValue(uint16Type, UInt16.MaxValue), New TypeAndValue(uint32Type, UInt32.MaxValue), New TypeAndValue(uint64Type, UInt64.MaxValue), New TypeAndValue(doubleType, Double.MaxValue), New TypeAndValue(singleType, Single.MaxValue), New TypeAndValue(decimalType, Decimal.MaxValue), New TypeAndValue(sbyteType, CSByte(-1)), New TypeAndValue(int16Type, CShort(-2)), New TypeAndValue(int32Type, CInt(-3)), New TypeAndValue(int64Type, CLng(-4)), New TypeAndValue(sbyteType, CSByte(5)), New TypeAndValue(int16Type, CShort(6)), New TypeAndValue(int32Type, CInt(7)), New TypeAndValue(int64Type, CLng(8)), New TypeAndValue(doubleType, CDbl(-9)), New TypeAndValue(singleType, CSng(-10)), New TypeAndValue(decimalType, CDec(-11)), New TypeAndValue(doubleType, CDbl(12)), New TypeAndValue(singleType, CSng(13)), New TypeAndValue(decimalType, CDec(14)), New TypeAndValue(byteType, CByte(15)), New TypeAndValue(uint16Type, CUShort(16)), New TypeAndValue(uint32Type, CUInt(17)), New TypeAndValue(uint64Type, CULng(18)), New TypeAndValue(decimalType, CDec(-11.3)), New TypeAndValue(doubleType, CDbl(&HF000000000000000UL)), New TypeAndValue(doubleType, CDbl(&H8000000000000000L)), New TypeAndValue(doubleType, CDbl(&H7FFFFFFFFFFFFC00L)), New TypeAndValue(typeCodeType, Int32.MinValue), New TypeAndValue(typeCodeType, Int32.MaxValue), New TypeAndValue(typeCodeType, CInt(-3)), New TypeAndValue(typeCodeType, CInt(7)) } Dim resultValue2 As ConstantValue Dim integerOverflow2 As Boolean For Each mv In nonZeroValues Dim v = ConstantValue.Create(mv.Value, mv.Type.GetConstantValueTypeDiscriminator()) Assert.Equal(v.Discriminator, mv.Type.GetConstantValueTypeDiscriminator()) literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), v, mv.Type) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, v, mv.Type, Nothing) For Each numericType In numericTypes Dim typeConv = ClassifyConversion(mv.Type, numericType) Dim conv = ClassifyConversion(literal, numericType, methodBodyBinder) Dim conv2 = ClassifyConversion(constant, numericType, methodBodyBinder) Assert.Equal(conv, conv2) resultValue = Conversions.TryFoldConstantConversion(literal, numericType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, numericType, integerOverflow2) Assert.Equal(resultValue Is Nothing, resultValue2 Is Nothing) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue IsNot Nothing AndAlso resultValue.IsBad, resultValue2 IsNot Nothing AndAlso resultValue2.IsBad) If resultValue IsNot Nothing Then Assert.Equal(resultValue2, resultValue) If Not resultValue.IsBad Then Assert.Equal(numericType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) End If End If Dim resultValueAsObject As Object = Nothing Dim overflow As Boolean = False Try resultValueAsObject = CheckedConvert(v.Value, numericType) Catch ex As OverflowException overflow = True End Try If Not overflow Then If Conversions.IsIdentityConversion(typeConv) Then Assert.True(Conversions.IsIdentityConversion(conv)) ElseIf Conversions.IsNarrowingConversion(typeConv) Then If mv.Type Is doubleType AndAlso numericType Is singleType Then Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesNarrowingFromNumericConstant, conv) ElseIf integralTypes.Contains(mv.Type) AndAlso integralTypes.Contains(numericType) AndAlso Not mv.Type.IsEnumType() AndAlso Not numericType.IsEnumType() Then Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesNarrowingFromNumericConstant, conv) Else Assert.Equal(typeConv, conv) End If ElseIf mv.Type.IsEnumType() Then Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, conv) Else Assert.Equal(ConversionKind.WideningNumeric, conv) End If Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(resultValueAsObject, resultValue.Value) If mv.Type Is doubleType AndAlso numericType Is singleType Then If v.DoubleValue = Double.MinValue Then Dim min As Single = Double.MinValue Assert.True(Single.IsNegativeInfinity(min)) Assert.Equal(resultValue.SingleValue, min) ElseIf v.DoubleValue = Double.MaxValue Then Dim max As Single = Double.MaxValue Assert.Equal(Double.MaxValue, v.DoubleValue) Assert.True(Single.IsPositiveInfinity(max)) Assert.Equal(resultValue.SingleValue, max) End If End If ElseIf Not integralTypes.Contains(mv.Type) OrElse Not integralTypes.Contains(numericType) Then 'Assert.Equal(typeConv, conv) If integralTypes.Contains(numericType) Then Assert.NotNull(resultValue) If resultValue.IsBad Then Assert.False(integerOverflow) Assert.Equal(ConversionKind.FailedDueToNumericOverflow, conv) Else Assert.True(integerOverflow) Assert.Equal(ConversionKind.FailedDueToIntegerOverflow, conv) Dim intermediate As Object If unsignedTypes.Contains(numericType) Then intermediate = Convert.ToUInt64(mv.Value) Else intermediate = Convert.ToInt64(mv.Value) End If Dim gotException As Boolean Try gotException = False CheckedConvert(intermediate, numericType) ' Should get an overflow Catch x As Exception gotException = True End Try Assert.True(gotException) Assert.Equal(UncheckedConvert(mv.Value, numericType), resultValue.Value) End If Else Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.True(resultValue.IsBad) Assert.Equal(ConversionKind.FailedDueToNumericOverflow, conv) End If Else ' An integer overflow case Assert.Equal(ConversionKind.FailedDueToIntegerOverflow, conv) Assert.NotNull(resultValue) Assert.True(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(UncheckedConvert(v.Value, numericType), resultValue.Value) End If Dim nullableType2 = nullableType.Construct(numericType) Dim zero = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, ConstantValue.Default(mv.Type.GetConstantValueTypeDiscriminator()), mv.Type, Nothing) conv = ClassifyConversion(literal, numericType, methodBodyBinder) If (conv And ConversionKind.FailedDueToNumericOverflowMask) = 0 Then conv = ClassifyConversion(mv.Type, nullableType2) Or (ClassifyConversion(zero, nullableType2, methodBodyBinder) And ConversionKind.InvolvesNarrowingFromNumericConstant) End If Assert.Equal(conv, ClassifyConversion(literal, nullableType2, methodBodyBinder)) Assert.Equal(conv, ClassifyConversion(constant, nullableType2, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, nullableType2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) resultValue = Conversions.TryFoldConstantConversion(constant, nullableType2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) Next Next Dim dbl As Double = -1.5 Dim doubleValue = ConstantValue.Create(dbl) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, doubleValue, doubleType, Nothing) resultValue = Conversions.TryFoldConstantConversion(constant, int32Type, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(-2, CInt(dbl)) Assert.Equal(-2, DirectCast(resultValue.Value, Int32)) dbl = -2.5 doubleValue = ConstantValue.Create(dbl) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, doubleValue, doubleType, Nothing) resultValue = Conversions.TryFoldConstantConversion(constant, int32Type, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(-2, CInt(dbl)) Assert.Equal(-2, DirectCast(resultValue.Value, Int32)) dbl = 1.5 doubleValue = ConstantValue.Create(dbl) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, doubleValue, doubleType, Nothing) resultValue = Conversions.TryFoldConstantConversion(constant, uint32Type, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(2UI, CUInt(dbl)) Assert.Equal(2UI, DirectCast(resultValue.Value, UInt32)) dbl = 2.5 doubleValue = ConstantValue.Create(dbl) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, doubleValue, doubleType, Nothing) resultValue = Conversions.TryFoldConstantConversion(constant, uint32Type, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(2UI, CUInt(dbl)) Assert.Equal(2UI, DirectCast(resultValue.Value, UInt32)) dbl = 2147483648.0 * 4294967296.0 + 10 doubleValue = ConstantValue.Create(dbl) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, doubleValue, doubleType, Nothing) resultValue = Conversions.TryFoldConstantConversion(constant, uint64Type, integerOverflow) Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(Convert.ToUInt64(dbl), DirectCast(resultValue.Value, UInt64)) ' ------- Boolean Dim falseValue = ConstantValue.Create(False) Assert.Equal(falseValue.Discriminator, booleanType.GetConstantValueTypeDiscriminator()) literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), falseValue, booleanType) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, falseValue, booleanType, Nothing) For Each numericType In numericTypes Dim typeConv = ClassifyConversion(booleanType, numericType) Dim conv = ClassifyConversion(literal, numericType, methodBodyBinder) Dim conv2 = ClassifyConversion(constant, numericType, methodBodyBinder) Assert.Equal(conv, conv2) Assert.Equal(typeConv, conv) resultValue = Conversions.TryFoldConstantConversion(literal, numericType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, numericType, integerOverflow2) Assert.NotNull(resultValue) Assert.NotNull(resultValue2) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue.IsBad, resultValue2.IsBad) Assert.Equal(resultValue2, resultValue) Assert.Equal(numericType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.Equal(0, Convert.ToInt64(resultValue.Value)) Next Dim trueValue = ConstantValue.Create(True) Assert.Equal(falseValue.Discriminator, booleanType.GetConstantValueTypeDiscriminator()) literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), trueValue, booleanType) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, trueValue, booleanType, Nothing) For Each numericType In numericTypes Dim typeConv = ClassifyConversion(booleanType, numericType) Dim conv = ClassifyConversion(literal, numericType, methodBodyBinder) Dim conv2 = ClassifyConversion(constant, numericType, methodBodyBinder) Assert.Equal(conv, conv2) Assert.Equal(typeConv, conv) resultValue = Conversions.TryFoldConstantConversion(literal, numericType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, numericType, integerOverflow2) Assert.NotNull(resultValue) Assert.NotNull(resultValue2) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue.IsBad, resultValue2.IsBad) Assert.Equal(resultValue2, resultValue) Assert.Equal(numericType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) 'The literal True converts to the literal 255 for Byte, 65535 for UShort, 4294967295 for UInteger, 18446744073709551615 for ULong, 'and to the expression -1 for SByte, Short, Integer, Long, Decimal, Single, and Double If numericType Is byteType Then Assert.Equal(255, DirectCast(resultValue.Value, Byte)) ElseIf numericType Is uint16Type Then Assert.Equal(65535, DirectCast(resultValue.Value, UInt16)) ElseIf numericType Is uint32Type Then Assert.Equal(4294967295, DirectCast(resultValue.Value, UInt32)) ElseIf numericType Is uint64Type Then Assert.Equal(18446744073709551615UL, DirectCast(resultValue.Value, UInt64)) Else Assert.Equal(-1, Convert.ToInt64(resultValue.Value)) End If Next resultValue = Conversions.TryFoldConstantConversion(literal, booleanType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, booleanType, integerOverflow2) Assert.NotNull(resultValue) Assert.NotNull(resultValue2) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue.IsBad, resultValue2.IsBad) Assert.Equal(resultValue2, resultValue) Assert.Equal(booleanType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.True(DirectCast(resultValue.Value, Boolean)) For Each mv In nonZeroValues Dim v = ConstantValue.Create(mv.Value, mv.Type.GetConstantValueTypeDiscriminator()) Assert.Equal(v.Discriminator, mv.Type.GetConstantValueTypeDiscriminator()) literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), v, mv.Type) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, v, mv.Type, Nothing) Dim typeConv = ClassifyConversion(mv.Type, booleanType) Dim conv = ClassifyConversion(literal, booleanType, methodBodyBinder) Dim conv2 = ClassifyConversion(constant, booleanType, methodBodyBinder) Assert.Equal(conv, conv2) Assert.Equal(typeConv, conv) resultValue = Conversions.TryFoldConstantConversion(literal, booleanType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, booleanType, integerOverflow2) Assert.NotNull(resultValue) Assert.NotNull(resultValue2) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue2, resultValue) Assert.Equal(booleanType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.True(DirectCast(resultValue.Value, Boolean)) Next ' ------- String <-> Char Dim stringValue = ConstantValue.Nothing Assert.Null(stringValue.StringValue) literal = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), stringValue, Nothing), ConversionKind.WideningNothingLiteral, False, True, stringValue, stringType, Nothing) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, stringValue, stringType, Nothing) Assert.Equal(ConversionKind.NarrowingString, ClassifyConversion(literal, charType, methodBodyBinder)) Assert.Equal(ConversionKind.NarrowingString, ClassifyConversion(constant, charType, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, charType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, charType, integerOverflow2) Assert.NotNull(resultValue) Assert.NotNull(resultValue2) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue2, resultValue) Assert.Equal(charType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.Equal(ChrW(0), CChar(stringValue.StringValue)) Assert.Equal(ChrW(0), DirectCast(resultValue.Value, Char)) stringValue = ConstantValue.Create("") Assert.Equal(0, stringValue.StringValue.Length) literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), stringValue, stringType) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, stringValue, stringType, Nothing) Assert.Equal(ConversionKind.NarrowingString, ClassifyConversion(literal, charType, methodBodyBinder)) Assert.Equal(ConversionKind.NarrowingString, ClassifyConversion(constant, charType, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, charType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, charType, integerOverflow2) Assert.NotNull(resultValue) Assert.NotNull(resultValue2) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue2, resultValue) Assert.Equal(charType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.Equal(ChrW(0), CChar("")) Assert.Equal(ChrW(0), DirectCast(resultValue.Value, Char)) stringValue = ConstantValue.Create("abc") literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), stringValue, stringType) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, stringValue, stringType, Nothing) Assert.Equal(ConversionKind.NarrowingString, ClassifyConversion(literal, charType, methodBodyBinder)) Assert.Equal(ConversionKind.NarrowingString, ClassifyConversion(constant, charType, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, charType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, charType, integerOverflow2) Assert.NotNull(resultValue) Assert.NotNull(resultValue2) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue2, resultValue) Assert.Equal(charType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.Equal("a"c, DirectCast(resultValue.Value, Char)) Dim charValue = ConstantValue.Create("b"c) literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), charValue, charType) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, charValue, charType, Nothing) Assert.Equal(ConversionKind.WideningString, ClassifyConversion(literal, stringType, methodBodyBinder)) Assert.Equal(ConversionKind.WideningString, ClassifyConversion(constant, stringType, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, stringType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, stringType, integerOverflow2) Assert.NotNull(resultValue) Assert.NotNull(resultValue2) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(integerOverflow, integerOverflow2) Assert.Equal(resultValue2, resultValue) Assert.Equal(stringType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) Assert.Equal("b", DirectCast(resultValue.Value, String)) End Sub <Fact()> Public Sub ConstantExpressionConversions2() Dim dummyCode = <file> Class C1 Shared Sub MethodDecl() End Sub End Class </file> Dim dummyTree = VisualBasicSyntaxTree.ParseText(dummyCode.Value) Dim c1 = VisualBasicCompilation.Create("Test", syntaxTrees:={dummyTree}, references:={Net40.References.mscorlib}, options:=TestOptions.ReleaseExe.WithOverflowChecks(False)) Dim sourceModule = DirectCast(c1.Assembly.Modules(0), SourceModuleSymbol) Dim methodDeclSymbol = DirectCast(sourceModule.GlobalNamespace.GetTypeMembers("C1").Single().GetMembers("MethodDecl").Single(), SourceMethodSymbol) Dim methodBodyBinder = BinderBuilder.CreateBinderForMethodBody(sourceModule, dummyTree, methodDeclSymbol) Assert.False(c1.Options.CheckOverflow) Dim objectType = c1.GetSpecialType(System_Object) Dim booleanType = c1.GetSpecialType(System_Boolean) Dim byteType = c1.GetSpecialType(System_Byte) Dim sbyteType = c1.GetSpecialType(System_SByte) Dim int16Type = c1.GetSpecialType(System_Int16) Dim uint16Type = c1.GetSpecialType(System_UInt16) Dim int32Type = c1.GetSpecialType(System_Int32) Dim uint32Type = c1.GetSpecialType(System_UInt32) Dim int64Type = c1.GetSpecialType(System_Int64) Dim uint64Type = c1.GetSpecialType(System_UInt64) Dim doubleType = c1.GetSpecialType(System_Double) Dim singleType = c1.GetSpecialType(System_Single) Dim decimalType = c1.GetSpecialType(System_Decimal) Dim dateType = c1.GetSpecialType(System_DateTime) Dim stringType = c1.GetSpecialType(System_String) Dim charType = c1.GetSpecialType(System_Char) Dim intPtrType = c1.GetSpecialType(System_IntPtr) Dim typeCodeType = c1.GlobalNamespace.GetMembers("System").OfType(Of NamespaceSymbol)().Single().GetTypeMembers("TypeCode").Single() Dim allTestTypes = New TypeSymbol() { objectType, booleanType, byteType, sbyteType, int16Type, uint16Type, int32Type, uint32Type, int64Type, uint64Type, doubleType, singleType, decimalType, dateType, stringType, charType, intPtrType, typeCodeType} Dim convertibleTypes = New HashSet(Of TypeSymbol)({ booleanType, byteType, sbyteType, int16Type, uint16Type, int32Type, uint32Type, int64Type, uint64Type, doubleType, singleType, decimalType, dateType, stringType, charType, typeCodeType}) Dim integralTypes = New HashSet(Of TypeSymbol)({ byteType, sbyteType, int16Type, uint16Type, int32Type, uint32Type, int64Type, uint64Type, typeCodeType}) Dim unsignedTypes = New HashSet(Of TypeSymbol)({ byteType, uint16Type, uint32Type, uint64Type}) Dim numericTypes = New HashSet(Of TypeSymbol)({ byteType, sbyteType, int16Type, uint16Type, int32Type, uint32Type, int64Type, uint64Type, doubleType, singleType, decimalType, typeCodeType}) Dim floatingTypes = New HashSet(Of TypeSymbol)({doubleType, singleType}) Dim _nothing = New BoundLiteral(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), ConstantValue.Nothing, Nothing) Dim resultValue As ConstantValue Dim integerOverflow As Boolean Dim literal As BoundLiteral Dim constant As BoundConversion Dim nullableType = c1.GetSpecialType(System_Nullable_T) ' -------- Numeric non-zero values Dim nonZeroValues = New TypeAndValue() { New TypeAndValue(sbyteType, SByte.MinValue), New TypeAndValue(int16Type, Int16.MinValue), New TypeAndValue(int32Type, Int32.MinValue), New TypeAndValue(int64Type, Int64.MinValue), New TypeAndValue(doubleType, Double.MinValue), New TypeAndValue(singleType, Single.MinValue), New TypeAndValue(decimalType, Decimal.MinValue), New TypeAndValue(sbyteType, SByte.MaxValue), New TypeAndValue(int16Type, Int16.MaxValue), New TypeAndValue(int32Type, Int32.MaxValue), New TypeAndValue(int64Type, Int64.MaxValue), New TypeAndValue(byteType, Byte.MaxValue), New TypeAndValue(uint16Type, UInt16.MaxValue), New TypeAndValue(uint32Type, UInt32.MaxValue), New TypeAndValue(uint64Type, UInt64.MaxValue), New TypeAndValue(doubleType, Double.MaxValue), New TypeAndValue(singleType, Single.MaxValue), New TypeAndValue(decimalType, Decimal.MaxValue), New TypeAndValue(sbyteType, CSByte(-1)), New TypeAndValue(int16Type, CShort(-2)), New TypeAndValue(int32Type, CInt(-3)), New TypeAndValue(int64Type, CLng(-4)), New TypeAndValue(sbyteType, CSByte(5)), New TypeAndValue(int16Type, CShort(6)), New TypeAndValue(int32Type, CInt(7)), New TypeAndValue(int64Type, CLng(8)), New TypeAndValue(doubleType, CDbl(-9)), New TypeAndValue(singleType, CSng(-10)), New TypeAndValue(decimalType, CDec(-11)), New TypeAndValue(doubleType, CDbl(12)), New TypeAndValue(singleType, CSng(13)), New TypeAndValue(decimalType, CDec(14)), New TypeAndValue(byteType, CByte(15)), New TypeAndValue(uint16Type, CUShort(16)), New TypeAndValue(uint32Type, CUInt(17)), New TypeAndValue(uint64Type, CULng(18)), New TypeAndValue(decimalType, CDec(-11.3)), New TypeAndValue(doubleType, CDbl(&HF000000000000000UL)), New TypeAndValue(doubleType, CDbl(&H8000000000000000L)), New TypeAndValue(doubleType, CDbl(&H7FFFFFFFFFFFFC00L)), New TypeAndValue(typeCodeType, Int32.MinValue), New TypeAndValue(typeCodeType, Int32.MaxValue), New TypeAndValue(typeCodeType, CInt(-3)), New TypeAndValue(typeCodeType, CInt(7)) } Dim resultValue2 As ConstantValue Dim integerOverflow2 As Boolean For Each mv In nonZeroValues Dim v = ConstantValue.Create(mv.Value, mv.Type.GetConstantValueTypeDiscriminator()) Assert.Equal(v.Discriminator, mv.Type.GetConstantValueTypeDiscriminator()) literal = New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), v, mv.Type) constant = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(DirectCast(dummyTree.GetRoot(Nothing), VisualBasicSyntaxNode), ConstantValue.Null, Nothing), ConversionKind.Widening, True, True, v, mv.Type, Nothing) For Each numericType In numericTypes Dim typeConv = ClassifyConversion(mv.Type, numericType) Dim conv = ClassifyConversion(literal, numericType, methodBodyBinder) Dim conv2 = ClassifyConversion(constant, numericType, methodBodyBinder) Assert.Equal(conv, conv2) resultValue = Conversions.TryFoldConstantConversion(literal, numericType, integerOverflow) resultValue2 = Conversions.TryFoldConstantConversion(constant, numericType, integerOverflow2) Assert.Equal(resultValue Is Nothing, resultValue2 Is Nothing) Assert.Equal(integerOverflow, integerOverflow2) If resultValue IsNot Nothing Then Assert.Equal(resultValue2, resultValue) If Not resultValue.IsBad Then Assert.Equal(numericType.GetConstantValueTypeDiscriminator(), resultValue.Discriminator) End If End If Dim resultValueAsObject As Object = Nothing Dim overflow As Boolean = False Try resultValueAsObject = CheckedConvert(v.Value, numericType) Catch ex As OverflowException overflow = True End Try If Not overflow Then If Conversions.IsIdentityConversion(typeConv) Then Assert.True(Conversions.IsIdentityConversion(conv)) ElseIf Conversions.IsNarrowingConversion(typeConv) Then If mv.Type Is doubleType AndAlso numericType Is singleType Then Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesNarrowingFromNumericConstant, conv) ElseIf integralTypes.Contains(mv.Type) AndAlso numericType.IsEnumType() Then Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, conv) ElseIf integralTypes.Contains(mv.Type) AndAlso integralTypes.Contains(numericType) AndAlso Not mv.Type.IsEnumType() AndAlso Not numericType.IsEnumType() Then Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesNarrowingFromNumericConstant, conv) Else Assert.Equal(typeConv, conv) End If ElseIf mv.Type.IsEnumType() Then Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, conv) Else Assert.Equal(ConversionKind.WideningNumeric, conv) End If Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(resultValueAsObject, resultValue.Value) If mv.Type Is doubleType AndAlso numericType Is singleType Then If v.DoubleValue = Double.MinValue Then Dim min As Single = Double.MinValue Assert.True(Single.IsNegativeInfinity(min)) Assert.Equal(resultValue.SingleValue, min) ElseIf v.DoubleValue = Double.MaxValue Then Dim max As Single = Double.MaxValue Assert.Equal(Double.MaxValue, v.DoubleValue) Assert.True(Single.IsPositiveInfinity(max)) Assert.Equal(resultValue.SingleValue, max) End If End If ElseIf Not integralTypes.Contains(mv.Type) OrElse Not integralTypes.Contains(numericType) Then 'Assert.Equal(typeConv, conv) If integralTypes.Contains(numericType) Then Assert.NotNull(resultValue) If resultValue.IsBad Then Assert.False(integerOverflow) Assert.Equal(ConversionKind.FailedDueToNumericOverflow, conv) Else Assert.True(integerOverflow) Assert.Equal(typeConv, conv) Dim intermediate As Object If unsignedTypes.Contains(numericType) Then intermediate = Convert.ToUInt64(mv.Value) Else intermediate = Convert.ToInt64(mv.Value) End If Dim gotException As Boolean Try gotException = False CheckedConvert(intermediate, numericType) ' Should get an overflow Catch x As Exception gotException = True End Try Assert.True(gotException) Assert.Equal(UncheckedConvert(mv.Value, numericType), resultValue.Value) End If Else Assert.NotNull(resultValue) Assert.False(integerOverflow) Assert.True(resultValue.IsBad) Assert.Equal(ConversionKind.FailedDueToNumericOverflow, conv) End If Else ' An integer overflow case If numericType.IsEnumType() OrElse mv.Type.IsEnumType() Then Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, conv) Else Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesNarrowingFromNumericConstant, conv) End If Assert.NotNull(resultValue) Assert.True(integerOverflow) Assert.False(resultValue.IsBad) Assert.Equal(UncheckedConvert(v.Value, numericType), resultValue.Value) End If Dim nullableType2 = nullableType.Construct(numericType) Dim zero = New BoundConversion(dummyTree.GetVisualBasicRoot(Nothing), New BoundLiteral(dummyTree.GetVisualBasicRoot(Nothing), ConstantValue.Default(ConstantValueTypeDiscriminator.Int32), int32Type), ConversionKind.Widening, True, True, ConstantValue.Default(mv.Type.GetConstantValueTypeDiscriminator()), mv.Type, Nothing) conv = ClassifyConversion(literal, numericType, methodBodyBinder) If (conv And ConversionKind.FailedDueToNumericOverflowMask) = 0 Then conv = ClassifyConversion(mv.Type, nullableType2) Or (ClassifyConversion(zero, nullableType2, methodBodyBinder) And ConversionKind.InvolvesNarrowingFromNumericConstant) End If Assert.Equal(conv, ClassifyConversion(literal, nullableType2, methodBodyBinder)) Assert.Equal(conv, ClassifyConversion(constant, nullableType2, methodBodyBinder)) resultValue = Conversions.TryFoldConstantConversion(literal, nullableType2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) resultValue = Conversions.TryFoldConstantConversion(constant, nullableType2, integerOverflow) Assert.Null(resultValue) Assert.False(integerOverflow) Next Next End Sub Private Function CheckedConvert(value As Object, type As TypeSymbol) As Object type = type.GetEnumUnderlyingTypeOrSelf() Dim c = CType(value, IConvertible) Select Case type.SpecialType Case System_Byte : Return c.ToByte(Nothing) Case System_SByte : Return c.ToSByte(Nothing) Case System_Int16 : Return c.ToInt16(Nothing) Case System_UInt16 : Return c.ToUInt16(Nothing) Case System_Int32 : Return c.ToInt32(Nothing) Case System_UInt32 : Return c.ToUInt32(Nothing) Case System_Int64 : Return c.ToInt64(Nothing) Case System_UInt64 : Return c.ToUInt64(Nothing) Case System_Single : Return c.ToSingle(Nothing) Case System_Double : Return c.ToDouble(Nothing) Case System_Decimal : Return c.ToDecimal(Nothing) Case Else Throw New NotSupportedException() End Select End Function Private Function UncheckedConvert(value As Object, type As TypeSymbol) As Object type = type.GetEnumUnderlyingTypeOrSelf() Select Case System.Type.GetTypeCode(value.GetType()) Case TypeCode.Byte, TypeCode.UInt16, TypeCode.UInt32, TypeCode.UInt64 Dim val As UInt64 = Convert.ToUInt64(value) Select Case type.SpecialType Case System_Byte : Return UncheckedCByte(UncheckedCLng(val)) Case System_SByte : Return UncheckedCSByte(UncheckedCLng(val)) Case System_Int16 : Return UncheckedCShort(val) Case System_UInt16 : Return UncheckedCUShort(UncheckedCLng(val)) Case System_Int32 : Return UncheckedCInt(val) Case System_UInt32 : Return UncheckedCUInt(val) Case System_Int64 : Return UncheckedCLng(val) Case System_UInt64 : Return UncheckedCULng(val) Case Else Throw New NotSupportedException() End Select Case TypeCode.SByte, TypeCode.Int16, TypeCode.Int32, TypeCode.Int64 Dim val As Int64 = Convert.ToInt64(value) Select Case type.SpecialType Case System_Byte : Return UncheckedCByte(val) Case System_SByte : Return UncheckedCSByte(val) Case System_Int16 : Return UncheckedCShort(val) Case System_UInt16 : Return UncheckedCUShort(val) Case System_Int32 : Return UncheckedCInt(val) Case System_UInt32 : Return UncheckedCUInt(val) Case System_Int64 : Return UncheckedCLng(val) Case System_UInt64 : Return UncheckedCULng(val) Case Else Throw New NotSupportedException() End Select Case TypeCode.Single, TypeCode.Double Dim val As Double = Convert.ToDouble(value) Select Case type.SpecialType Case System_Byte : Return UncheckedCByte(UncheckedCLng(val)) Case System_SByte : Return UncheckedCSByte(UncheckedCLng(val)) Case System_Int16 : Return UncheckedCShort(UncheckedCLng(val)) Case System_UInt16 : Return UncheckedCUShort(UncheckedCLng(val)) Case System_Int32 : Return UncheckedCInt(UncheckedCLng(val)) Case System_UInt32 : Return UncheckedCUInt(UncheckedCLng(val)) Case System_Int64 : Return UncheckedCLng(val) Case System_UInt64 : Return UncheckedCULng(val) Case Else Throw New NotSupportedException() End Select Case Else Throw New NotSupportedException() End Select Select Case type.SpecialType Case System_Byte : Return CByte(value) Case System_SByte : Return CSByte(value) Case System_Int16 : Return CShort(value) Case System_UInt16 : Return CUShort(value) Case System_Int32 : Return CInt(value) Case System_UInt32 : Return CUInt(value) Case System_Int64 : Return CLng(value) Case System_UInt64 : Return CULng(value) Case System_Single : Return CSng(value) Case System_Double : Return CDbl(value) Case System_Decimal : Return CDec(value) Case Else Throw New NotSupportedException() End Select End Function Friend Structure TypeAndValue Public ReadOnly Type As TypeSymbol Public ReadOnly Value As Object Public Sub New(type As TypeSymbol, value As Object) Me.Type = type Me.Value = value End Sub End Structure <Fact()> Public Sub PredefinedNotBuiltIn() ' Tests are based on the source code used to compile VBConversions.dll, VBConversions.vb is ' checked in next to the DLL. Dim vbConversionsRef = TestReferences.SymbolsTests.VBConversions Dim modifiersRef = TestReferences.SymbolsTests.CustomModifiers.Modifiers.dll Dim c1 = VisualBasicCompilation.Create("Test", references:={Net40.References.mscorlib, vbConversionsRef, modifiersRef}) Dim asmVBConversions = c1.GetReferencedAssemblySymbol(vbConversionsRef) Dim asmModifiers = c1.GetReferencedAssemblySymbol(modifiersRef) Dim test = asmVBConversions.Modules(0).GlobalNamespace.GetTypeMembers("Test").Single() '--------------- Identity Dim m1 = DirectCast(test.GetMembers("M1").Single(), MethodSymbol) Dim m1p = m1.Parameters.Select(Function(p) p.Type).ToArray() Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m1p(a), m1p(b)))) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(a), m1p(c))) 'error BC30311: Value of type 'Class2' cannot be converted to 'Class1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(a), m1p(d))) 'error BC30311: Value of type '1-dimensional array of Class1' cannot be converted to 'Class1'. Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m1p(d), m1p(e)))) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(d), m1p(f))) 'error BC30332: Value of type '1-dimensional array of Class2' cannot be converted to '1-dimensional array of Class1' because 'Class2' is not derived from 'Class1'. Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m1p(g), m1p(h)))) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(g), m1p(i))) 'error BC30311: Value of type 'Class2.Class3(Of Byte)' cannot be converted to 'Class2.Class3(Of Integer)'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(g), m1p(j))) 'error BC30311: Value of type 'Class4(Of Integer)' cannot be converted to 'Class2.Class3(Of Integer)'. Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m1p(j), m1p(k)))) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(j), m1p(l))) 'error BC30311: Value of type 'Class4(Of Byte)' cannot be converted to 'Class4(Of Integer)'. Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m1p(m), m1p(n)))) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(m), m1p(o))) 'error BC30311: Value of type 'Class4(Of Byte).Class5(Of Integer)' cannot be converted to 'Class4(Of Integer).Class5(Of Integer)'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(m), m1p(p))) 'error BC30311: Value of type 'Class4(Of Integer).Class5(Of Byte)' cannot be converted to 'Class4(Of Integer).Class5(Of Integer)'. Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m1p(q), m1p(r)))) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(q), m1p(s))) 'error BC30311: Value of type 'Class4(Of Byte).Class6' cannot be converted to 'Class4(Of Integer).Class6'. Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m1p(t), m1p(u)))) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(t), m1p(v))) 'error BC30311: Value of type 'Class4(Of Byte).Class6.Class7(Of Integer)' cannot be converted to 'Class4(Of Integer).Class6.Class7(Of Integer)'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m1p(t), m1p(w))) 'error BC30311: Value of type 'Class4(Of Integer).Class6.Class7(Of Byte)' cannot be converted to 'Class4(Of Integer).Class6.Class7(Of Integer)'. Dim modifiers = asmModifiers.Modules(0).GlobalNamespace.GetTypeMembers("Modifiers").Single() Dim modifiedArrayInt32 = modifiers.GetMembers("F5").OfType(Of MethodSymbol)().Single().Parameters(0).Type Dim arrayInt32 = c1.CreateArrayTypeSymbol(c1.GetSpecialType(System_Int32)) Assert.NotEqual(modifiedArrayInt32, arrayInt32) Assert.NotEqual(arrayInt32, modifiedArrayInt32) Assert.True(arrayInt32.IsSameTypeIgnoringAll(modifiedArrayInt32)) Assert.True(modifiedArrayInt32.IsSameTypeIgnoringAll(arrayInt32)) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(arrayInt32, modifiedArrayInt32))) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(modifiedArrayInt32, arrayInt32))) Dim enumerable = c1.GetSpecialType(System_Collections_Generic_IEnumerable_T) Dim enumerableOfModifiedArrayInt32 = enumerable.Construct(modifiedArrayInt32) Dim enumerableOfArrayInt32 = enumerable.Construct(arrayInt32) Assert.NotEqual(enumerableOfModifiedArrayInt32, enumerableOfArrayInt32) Assert.NotEqual(enumerableOfArrayInt32, enumerableOfModifiedArrayInt32) Assert.True(enumerableOfArrayInt32.IsSameTypeIgnoringAll(enumerableOfModifiedArrayInt32)) Assert.True(enumerableOfModifiedArrayInt32.IsSameTypeIgnoringAll(enumerableOfArrayInt32)) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(enumerableOfArrayInt32, enumerableOfModifiedArrayInt32))) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(enumerableOfModifiedArrayInt32, enumerableOfArrayInt32))) '--------------- Numeric Dim m2 = DirectCast(test.GetMembers("M2").Single(), MethodSymbol) Dim m2p = m2.Parameters.Select(Function(p) p.Type).ToArray() Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m2p(a), m2p(b)))) Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(a), m2p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Enum2' to 'Enum1'. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(a), m2p(d))) 'error BC30512: Option Strict On disallows implicit conversions from 'Enum3' to 'Enum1'. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(a), m2p(e))) 'error BC30512: Option Strict On disallows implicit conversions from 'Integer' to 'Enum1'. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(a), m2p(f))) 'error BC30512: Option Strict On disallows implicit conversions from 'Long' to 'Enum1'. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(a), m2p(g))) 'error BC30512: Option Strict On disallows implicit conversions from 'Short' to 'Enum1'. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(a), m2p(h))) 'error BC30512: Option Strict On disallows implicit conversions from 'Enum4' to 'Enum1'. Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(e), m2p(a))) Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(e), m2p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Enum2' to 'Integer'. Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(e), m2p(d))) Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(f), m2p(a))) Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(f), m2p(c))) Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(f), m2p(d))) Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(g), m2p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Enum1' to 'Short'. Assert.Equal(ConversionKind.NarrowingNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(g), m2p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Enum2' to 'Short'. Assert.Equal(ConversionKind.WideningNumeric Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m2p(g), m2p(d))) '--------------- Reference Dim m3 = DirectCast(test.GetMembers("M3").Single(), MethodSymbol) Dim m3p = m3.Parameters.Select(Function(p) p.Type).ToArray() Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m3p(a), m3p(a)))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(a), m3p(d))) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m3p(b), m3p(b)))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(b), m3p(c))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(b), m3p(d))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(c), m3p(d))) Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(d), m3p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'Class10'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(c), m3p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'Class9'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(d), m3p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'Class10'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(d), m3p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class9' to 'Class10'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(c), m3p(e))) 'error BC30311: Value of type 'Class11' cannot be converted to 'Class9'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(e), m3p(c))) 'error BC30311: Value of type 'Class9' cannot be converted to 'Class11'. Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(a), m3p(g))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(f), m3p(g))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(a), m3p(h))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(f), m3p(h))) Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(g), m3p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to '1-dimensional array of Integer'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(g), m3p(f))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Array' to '1-dimensional array of Integer'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(h), m3p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to '2-dimensional array of Integer'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(h), m3p(f))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Array' to '2-dimensional array of Integer'. Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(i), m3p(d))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(j), m3p(d))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(k), m3p(d))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(l), m3p(c))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(l), m3p(d))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(m), m3p(b))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(m), m3p(c))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(m), m3p(d))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(n), m3p(d))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(p), m3p(g))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(p), m3p(h))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(q), m3p(g))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(r), m3p(g))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(s), m3p(g))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(v), m3p(u))) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m3p(i), m3p(i)))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(i), m3p(j))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(i), m3p(k))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(i), m3p(o))) Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(n), m3p(o))) Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(i), m3p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'Interface1'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(i), m3p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class9' to 'Interface1'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(i), m3p(e))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class11' to 'Interface1'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(j), m3p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'Interface2'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(j), m3p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class9' to 'Interface2'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(k), m3p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'Interface3'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(k), m3p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class9' to 'Interface3'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(l), m3p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'Interface4'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(n), m3p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'Interface6'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(n), m3p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class9' to 'Interface6'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(o), m3p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'Interface7'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(o), m3p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class9' to 'Interface7'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(o), m3p(d))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class10' to 'Interface7'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(q), m3p(h))) 'error BC30311: Value of type '2-dimensional array of Integer' cannot be converted to 'System.Collections.Generic.IList(Of Integer)'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(r), m3p(h))) 'error BC30311: Value of type '2-dimensional array of Integer' cannot be converted to 'System.Collections.Generic.ICollection(Of Integer)'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(s), m3p(h))) 'error BC30311: Value of type '2-dimensional array of Integer' cannot be converted to 'System.Collections.Generic.IEnumerable(Of Integer)'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(t), m3p(g))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Integer' to 'System.Collections.Generic.IList(Of Long)'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(w), m3p(u))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Class9' to 'System.Collections.Generic.IList(Of Class11)'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(i), m3p(l))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface4' to 'Interface1'. Assert.Equal(ConversionKind.NarrowingReference Or ConversionKind.DelegateRelaxationLevelNarrowing, ClassifyPredefinedAssignment(m3p(o), m3p(x))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Action' to 'Interface7'. Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment(m3p(a), m3p(o))) Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(x), m3p(o))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface7' to 'System.Action'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(e), m3p(o))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface7' to 'Class11'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(g), m3p(o))) 'error BC30311: Value of type 'Interface7' cannot be converted to '1-dimensional array of Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(h), m3p(o))) 'error BC30311: Value of type 'Interface7' cannot be converted to '2-dimensional array of Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(u), m3p(o))) 'error BC30311: Value of type 'Interface7' cannot be converted to '1-dimensional array of Class9'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(g), m3p(p))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.IEnumerable' to '1-dimensional array of Integer'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(h), m3p(p))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.IEnumerable' to '2-dimensional array of Integer'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(g), m3p(q))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.Generic.IList(Of Integer)' to '1-dimensional array of Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(h), m3p(q))) 'error BC30311: Value of type 'System.Collections.Generic.IList(Of Integer)' cannot be converted to '2-dimensional array of Integer'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(g), m3p(t))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.Generic.IList(Of Long)' to '1-dimensional array of Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(h), m3p(t))) 'error BC30311: Value of type 'System.Collections.Generic.IList(Of Long)' cannot be converted to '2-dimensional array of Integer'. Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(g), m3p(w))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.Generic.IList(Of Class11)' to '1-dimensional array of Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m3p(h), m3p(w))) 'error BC30311: Value of type 'System.Collections.Generic.IList(Of Class11)' cannot be converted to '2-dimensional array of Integer'. Dim [object] = c1.GetSpecialType(System_Object) Dim module2 = asmVBConversions.Modules(0).GlobalNamespace.GetTypeMembers("Module2").Single() Assert.Equal(ConversionKind.WideningReference, ClassifyPredefinedAssignment([object], module2)) Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(module2, [object])) Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(m3p(i), module2)) Assert.Equal(ConversionKind.NarrowingReference, ClassifyPredefinedAssignment(module2, m3p(i))) ' ------------- Type Parameter Dim m6 = DirectCast(test.GetMembers("M6").Single(), MethodSymbol) Dim m6p = m6.Parameters.Select(Function(p) p.Type).ToArray() Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m6p(b), m6p(b)))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(a), m6p(b))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(a), m6p(c))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(a), m6p(d))) Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(b), m6p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'MT1'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(c), m6p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'MT2'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(d), m6p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'MT3'. Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(e), m6p(f))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(e), m6p(h))) Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(f), m6p(e))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface3' to 'MT4'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(h), m6p(e))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface3' to 'MT6'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(f), m6p(g))) 'error BC30311: Value of type 'MT5' cannot be converted to 'MT4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(g), m6p(f))) 'error BC30311: Value of type 'MT4' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(h), m6p(i))) 'error BC30311: Value of type 'MT7' cannot be converted to 'MT6'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(i), m6p(h))) 'error BC30311: Value of type 'MT6' cannot be converted to 'MT7'. Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(e), m6p(k))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(j), m6p(k))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(j), m6p(f))) Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(k), m6p(e))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface3' to 'MT8'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(k), m6p(j))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface1' to 'MT8'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(f), m6p(j))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface1' to 'MT4'. Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(l), m6p(k))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(m), m6p(k))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(p), m6p(c))) Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(k), m6p(l))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class10' to 'MT8'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(k), m6p(m))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'MT8'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(c), m6p(p))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.ValueType' to 'MT2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(n), m6p(k))) 'error BC30311: Value of type 'MT8' cannot be converted to 'Class12'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(k), m6p(n))) 'error BC30311: Value of type 'Class12' cannot be converted to 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(k), m6p(o))) 'error BC30311: Value of type 'MT9' cannot be converted to 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(o), m6p(k))) 'error BC30311: Value of type 'MT8' cannot be converted to 'MT9'. Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(b), m6p(q))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(b), m6p(r))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(t), m6p(s))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m6p(m), m6p(s))) Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(q), m6p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT1' to 'MT10'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(r), m6p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT1' to 'MT11'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(s), m6p(t))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class9' to 'MT13'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(s), m6p(m))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class8' to 'MT13'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(l), m6p(s))) 'error BC30311: Value of type 'MT13' cannot be converted to 'Class10'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(s), m6p(l))) 'error BC30311: Value of type 'Class10' cannot be converted to 'MT13'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(u), m6p(k))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT8' to 'Interface7'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(k), m6p(u))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface7' to 'MT8'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(u), m6p(f))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT4' to 'Interface7'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(f), m6p(u))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface7' to 'MT4'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(u), m6p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT1' to 'Interface7'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(b), m6p(u))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface7' to 'MT1'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(u), m6p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT2' to 'Interface7'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m6p(c), m6p(u))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface7' to 'MT2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(v), m6p(q))) 'error BC30311: Value of type 'MT10' cannot be converted to 'MT14'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m6p(q), m6p(v))) 'error BC30311: Value of type 'MT14' cannot be converted to 'MT10'. Dim m7 = DirectCast(test.GetMembers("M7").Single(), MethodSymbol) Dim m7p = m7.Parameters.Select(Function(p) p.Type).ToArray() Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(p), m7p(a))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(p), m7p(b))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(q), m7p(c))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(q), m7p(d))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(r), m7p(d))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(t), m7p(g))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(v), m7p(j))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(v), m7p(k))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(w), m7p(n))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(x), m7p(i))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(y), m7p(j))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m7p(y), m7p(k))) Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(a), m7p(p))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'MT1'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(b), m7p(p))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'MT2'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(c), m7p(q))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Enum' to 'MT3'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(d), m7p(q))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Enum' to 'MT4'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(d), m7p(r))) 'error BC30512: Option Strict On disallows implicit conversions from 'Enum1' to 'MT4'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(g), m7p(t))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Integer' to 'MT7'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(j), m7p(v))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Class9' to 'MT10'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(k), m7p(v))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Class9' to 'MT11'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(n), m7p(w))) 'error BC30512: Option Strict On disallows implicit conversions from 'Structure1' to 'MT14'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(i), m7p(x))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.IEnumerable' to 'MT9'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(y), m7p(i))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT9' to 'System.Collections.Generic.IList(Of Class9)'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(i), m7p(y))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.Generic.IList(Of Class9)' to 'MT9'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(j), m7p(y))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.Generic.IList(Of Class9)' to 'MT10' Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(k), m7p(y))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.Generic.IList(Of Class9)' to 'MT11' Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(y), m7p(z))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT15' to 'System.Collections.Generic.IList(Of Class9)' Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(z), m7p(y))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Collections.Generic.IList(Of Class9)' to 'MT15' Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(n), m7p(o))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface1' to 'MT14'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(o), m7p(n))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT14' to 'Interface1'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(m), m7p(o))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface1' to 'MT13'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(o), m7p(m))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT13' to 'Interface1'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(d), m7p(o))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface1' to 'MT4'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m7p(o), m7p(d))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT4' to 'Interface1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(r), m7p(e))) 'error BC30311: Value of type 'MT5' cannot be converted to 'Enum1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(e), m7p(r))) 'error BC30311: Value of type 'Enum1' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(s), m7p(d))) 'error BC30311: Value of type 'MT4' cannot be converted to 'Enum2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(d), m7p(s))) 'error BC30311: Value of type 'Enum2' cannot be converted to 'MT4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(r), m7p(f))) 'error BC30311: Value of type 'MT6' cannot be converted to 'Enum1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(f), m7p(r))) 'error BC30311: Value of type 'Enum1' cannot be converted to 'MT6'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(t), m7p(h))) 'error BC30311: Value of type 'MT8' cannot be converted to '1-dimensional array of Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(h), m7p(t))) 'error BC30311: Value of type '1-dimensional array of Integer' cannot be converted to 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(v), m7p(i))) 'error BC30311: Value of type 'MT9' cannot be converted to '1-dimensional array of Class9'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(i), m7p(v))) 'error BC30311: Value of type '1-dimensional array of Class9' cannot be converted to 'MT9'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(a), m7p(b))) 'error BC30311: Value of type 'MT2' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(b), m7p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(g), m7p(h))) 'error BC30311: Value of type 'MT8' cannot be converted to 'MT7'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(h), m7p(g))) 'error BC30311: Value of type 'MT7' cannot be converted to 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(g), m7p(l))) 'error BC30311: Value of type 'MT12' cannot be converted to 'MT7'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(l), m7p(g))) 'error BC30311: Value of type 'MT7' cannot be converted to 'MT12'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(c), m7p(d))) 'error BC30311: Value of type 'MT4' cannot be converted to 'MT3'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(d), m7p(c))) 'error BC30311: Value of type 'MT3' cannot be converted to 'MT4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(i), m7p(j))) 'error BC30311: Value of type 'MT10' cannot be converted to 'MT9'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(j), m7p(i))) 'error BC30311: Value of type 'MT9' cannot be converted to 'MT10'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(a), m7p(n))) 'error BC30311: Value of type 'MT14' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(n), m7p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT14'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(d), m7p(f))) 'error BC30311: Value of type 'MT6' cannot be converted to 'MT4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m7p(f), m7p(d))) 'error BC30311: Value of type 'MT4' cannot be converted to 'MT6'. Dim m8 = DirectCast(test.GetMembers("M8").Single(), MethodSymbol) Dim m8p = m8.Parameters.Select(Function(p) p.Type).ToArray() Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m8p(a), m8p(a)))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m8p(a), m8p(d))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m8p(b), m8p(f))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m8p(a), m8p(c))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m8p(b), m8p(e))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m8p(g), m8p(h))) Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m8p(c), m8p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT1' to 'MT3'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m8p(d), m8p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT1' to 'MT4'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m8p(e), m8p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT2' to 'MT5'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m8p(f), m8p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT2' to 'MT6'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m8p(h), m8p(g))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT7' to 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m8p(a), m8p(b))) 'error BC30311: Value of type 'MT2' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m8p(b), m8p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m8p(b), m8p(d))) 'error BC30311: Value of type 'MT4' cannot be converted to 'MT2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m8p(d), m8p(b))) 'error BC30311: Value of type 'MT2' cannot be converted to 'MT4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m8p(a), m8p(g))) 'error BC30311: Value of type 'MT7' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m8p(g), m8p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT7'. Dim m9 = DirectCast(test.GetMembers("M9").Single(), MethodSymbol) Dim m9p = m9.Parameters.Select(Function(p) p.Type).ToArray() Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m9p(a), m9p(b))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m9p(j), m9p(a))) Assert.Equal(ConversionKind.WideningTypeParameter Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m9p(j), m9p(e))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m9p(l), m9p(e))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m9p(m), m9p(n))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m9p(p), m9p(q))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m9p(s), m9p(u))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m9p(t), m9p(u))) Assert.Equal(ConversionKind.WideningTypeParameter, ClassifyPredefinedAssignment(m9p(s), m9p(v))) Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m9p(b), m9p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT1' to 'MT2'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m9p(a), m9p(j))) 'error BC30512: Option Strict On disallows implicit conversions from 'Integer' to 'MT1'. Assert.Equal(ConversionKind.NarrowingTypeParameter Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m9p(e), m9p(j))) 'error BC30512: Option Strict On disallows implicit conversions from 'Integer' to 'MT5'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m9p(e), m9p(l))) 'error BC30512: Option Strict On disallows implicit conversions from 'Enum1' to 'MT5'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m9p(n), m9p(m))) 'error BC30512: Option Strict On disallows implicit conversions from 'Structure1' to 'MT10'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m9p(q), m9p(p))) 'error BC30512: Option Strict On disallows implicit conversions from 'Class1' to 'MT12'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m9p(u), m9p(s))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.ValueType' to 'MT15'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m9p(u), m9p(t))) 'error BC30512: Option Strict On disallows implicit conversions from 'MT14' to 'MT15'. Assert.Equal(ConversionKind.NarrowingTypeParameter, ClassifyPredefinedAssignment(m9p(v), m9p(s))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.ValueType' to 'MT16'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(a), m9p(e))) 'error BC30311: Value of type 'MT5' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(e), m9p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(e), m9p(g))) 'error BC30311: Value of type 'MT7' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(g), m9p(e))) 'error BC30311: Value of type 'MT5' cannot be converted to 'MT7'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(a), m9p(l))) 'error BC30311: Value of type 'Enum1' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(l), m9p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'Enum1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(a), m9p(i))) 'error BC30311: Value of type 'MT9' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(a), m9p(c))) 'error BC30311: Value of type 'MT3' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(c), m9p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT3'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(a), m9p(d))) 'error BC30311: Value of type 'MT4' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(d), m9p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(a), m9p(f))) 'error BC30311: Value of type 'MT6' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(f), m9p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT6'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(a), m9p(h))) 'error BC30311: Value of type 'MT8' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(h), m9p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(e), m9p(f))) 'error BC30311: Value of type 'MT6' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(f), m9p(e))) 'error BC30311: Value of type 'MT5' cannot be converted to 'MT6'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(e), m9p(h))) 'error BC30311: Value of type 'MT8' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(h), m9p(e))) 'error BC30311: Value of type 'MT5' cannot be converted to 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(a), m9p(k))) 'error BC30311: Value of type 'UInteger' cannot be converted to 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(k), m9p(a))) 'error BC30311: Value of type 'MT1' cannot be converted to 'UInteger'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(e), m9p(k))) 'error BC30311: Value of type 'UInteger' cannot be converted to 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(k), m9p(e))) 'error BC30311: Value of type 'MT5' cannot be converted to 'UInteger'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(n), m9p(o))) 'error BC30311: Value of type 'MT11' cannot be converted to 'MT10'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(o), m9p(n))) 'error BC30311: Value of type 'MT10' cannot be converted to 'MT11'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(q), m9p(r))) 'error BC30311: Value of type 'MT13' cannot be converted to 'MT12'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(r), m9p(q))) 'error BC30311: Value of type 'MT12' cannot be converted to 'MT13'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(v), m9p(w))) 'error BC30311: Value of type 'MT17' cannot be converted to 'MT16'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m9p(w), m9p(v))) 'error BC30311: Value of type 'MT16' cannot be converted to 'MT17'. ' ------------- Array conversions Dim m4 = DirectCast(test.GetMembers("M4").Single(), MethodSymbol) Dim m4p = m4.Parameters.Select(Function(p) p.Type).ToArray() Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m4p(a), m4p(a)))) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m4p(l), m4p(l)))) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m4p(n), m4p(n)))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(a), m4p(d))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(b), m4p(f))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(i), m4p(j))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(i), m4p(k))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(l), m4p(m))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(n), m4p(o))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(p), m4p(i))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(x), m4p(i))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m4p(x), m4p(w))) Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(a), m4p(c))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT3' to '1-dimensional array of MT1'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(c), m4p(a))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT1' to '1-dimensional array of MT3'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(d), m4p(a))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT1' to '1-dimensional array of MT4'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(b), m4p(e))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT5' to '1-dimensional array of MT2'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(e), m4p(b))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT2' to '1-dimensional array of MT5'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(f), m4p(b))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT2' to '1-dimensional array of MT6'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(g), m4p(h))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT8' to '1-dimensional array of MT7'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(h), m4p(g))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT7' to '1-dimensional array of MT8'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(j), m4p(i))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Class8' to '1-dimensional array of Class9'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(k), m4p(i))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Class8' to '1-dimensional array of Class11'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(m), m4p(l))) 'error BC30512: Option Strict On disallows implicit conversions from '2-dimensional array of Class8' to '2-dimensional array of Class9'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(o), m4p(n))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of 1-dimensional array of Class8' to '1-dimensional array of 1-dimensional array of Class9'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(i), m4p(p))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Interface5' to '1-dimensional array of Class8'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(i), m4p(x))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Object' to '1-dimensional array of Class8'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m4p(w), m4p(x))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Object' to '1-dimensional array of System.ValueType'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(a), m4p(b))) 'error BC30332: Value of type '1-dimensional array of MT2' cannot be converted to '1-dimensional array of MT1' because 'MT2' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(b), m4p(a))) 'error BC30332: Value of type '1-dimensional array of MT1' cannot be converted to '1-dimensional array of MT2' because 'MT1' is not derived from 'MT2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(b), m4p(d))) 'error BC30332: Value of type '1-dimensional array of MT4' cannot be converted to '1-dimensional array of MT2' because 'MT4' is not derived from 'MT2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(d), m4p(b))) 'error BC30332: Value of type '1-dimensional array of MT2' cannot be converted to '1-dimensional array of MT4' because 'MT2' is not derived from 'MT4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(a), m4p(g))) 'error BC30332: Value of type '1-dimensional array of MT7' cannot be converted to '1-dimensional array of MT1' because 'MT7' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(g), m4p(a))) 'error BC30332: Value of type '1-dimensional array of MT1' cannot be converted to '1-dimensional array of MT7' because 'MT1' is not derived from 'MT7'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(j), m4p(k))) 'error BC30332: Value of type '1-dimensional array of Class11' cannot be converted to '1-dimensional array of Class9' because 'Class11' is not derived from 'Class9'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(i), m4p(l))) 'error BC30414: Value of type '2-dimensional array of Class8' cannot be converted to '1-dimensional array of Class8' because the array types have different numbers of dimensions. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(l), m4p(i))) 'error BC30414: Value of type '1-dimensional array of Class8' cannot be converted to '2-dimensional array of Class8' because the array types have different numbers of dimensions. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(l), m4p(n))) 'error BC30332: Value of type '1-dimensional array of 1-dimensional array of Class8' cannot be converted to '2-dimensional array of Class8' because '1-dimensional array of Class8' is not derived from 'Class8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(n), m4p(l))) 'error BC30332: Value of type '2-dimensional array of Class8' cannot be converted to '1-dimensional array of 1-dimensional array of Class8' because 'Class8' is not derived from '1-dimensional array of Class8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(p), m4p(q))) 'error BC30332: Value of type '1-dimensional array of Structure1' cannot be converted to '1-dimensional array of Interface5' because 'Structure1' is not derived from 'Interface5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(q), m4p(p))) 'error BC30332: Value of type '1-dimensional array of Interface5' cannot be converted to '1-dimensional array of Structure1' because 'Interface5' is not derived from 'Structure1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(q), m4p(w))) 'error BC30332: Value of type '1-dimensional array of System.ValueType' cannot be converted to '1-dimensional array of Structure1' because 'System.ValueType' is not derived from 'Structure1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(w), m4p(q))) 'error BC30333: Value of type '1-dimensional array of Structure1' cannot be converted to '1-dimensional array of System.ValueType' because 'Structure1' is not a reference type. Assert.Equal(ConversionKind.WideningArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m4p(r), m4p(t))) Assert.Equal(ConversionKind.WideningArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m4p(s), m4p(u))) Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m4p(t), m4p(r))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Integer' to '1-dimensional array of Enum1'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m4p(u), m4p(s))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Long' to '1-dimensional array of Enum2'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m4p(t), m4p(v))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Enum4' to '1-dimensional array of Enum1'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m4p(v), m4p(t))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Enum1' to '1-dimensional array of Enum4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(r), m4p(s))) 'error BC30332: Value of type '1-dimensional array of Long' cannot be converted to '1-dimensional array of Integer' because 'Long' is not derived from 'Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(s), m4p(r))) 'error BC30332: Value of type '1-dimensional array of Integer' cannot be converted to '1-dimensional array of Long' because 'Integer' is not derived from 'Long'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(r), m4p(u))) 'error BC30332: Value of type '1-dimensional array of Enum2' cannot be converted to '1-dimensional array of Integer' because 'Enum2' is not derived from 'Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(u), m4p(r))) 'error BC30332: Value of type '1-dimensional array of Integer' cannot be converted to '1-dimensional array of Enum2' because 'Integer' is not derived from 'Enum2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(t), m4p(u))) 'error BC30332: Value of type '1-dimensional array of Enum2' cannot be converted to '1-dimensional array of Enum1' because 'Enum2' is not derived from 'Enum1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m4p(u), m4p(t))) 'error BC30332: Value of type '1-dimensional array of Enum1' cannot be converted to '1-dimensional array of Enum2' because 'Enum1' is not derived from 'Enum2'. Dim m5 = DirectCast(test.GetMembers("M5").Single(), MethodSymbol) Dim m5p = m5.Parameters.Select(Function(p) p.Type).ToArray() Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m5p(a), m5p(b))) Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(b), m5p(a))) ' error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT1' to '1-dimensional array of MT2'. Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m5p(j), m5p(a))) Assert.Equal(ConversionKind.WideningArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m5p(j), m5p(e))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m5p(l), m5p(e))) Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m5p(a), m5p(e))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT5' to '1-dimensional array of MT1'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m5p(e), m5p(a))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT1' to '1-dimensional array of MT5'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m5p(e), m5p(g))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT7' to '1-dimensional array of MT5'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m5p(g), m5p(e))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT5' to '1-dimensional array of MT7'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(a), m5p(j))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Integer' to '1-dimensional array of MT1'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m5p(a), m5p(l))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Enum1' to '1-dimensional array of MT1'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m5p(l), m5p(a))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT1' to '1-dimensional array of Enum1'. Assert.Equal(ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions, ClassifyPredefinedAssignment(m5p(e), m5p(j))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Integer' to '1-dimensional array of MT5'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(e), m5p(l))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Enum1' to '1-dimensional array of MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(a), m5p(i))) 'error BC30332: Value of type '1-dimensional array of MT9' cannot be converted to '1-dimensional array of MT1' because 'MT9' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(a), m5p(c))) 'error BC30332: Value of type '1-dimensional array of MT3' cannot be converted to '1-dimensional array of MT1' because 'MT3' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(c), m5p(a))) 'error BC30332: Value of type '1-dimensional array of MT1' cannot be converted to '1-dimensional array of MT3' because 'MT1' is not derived from 'MT3'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(a), m5p(d))) 'error BC30332: Value of type '1-dimensional array of MT4' cannot be converted to '1-dimensional array of MT1' because 'MT4' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(d), m5p(a))) 'error BC30332: Value of type '1-dimensional array of MT1' cannot be converted to '1-dimensional array of MT4' because 'MT1' is not derived from 'MT4'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(a), m5p(f))) 'error BC30332: Value of type '1-dimensional array of MT6' cannot be converted to '1-dimensional array of MT1' because 'MT6' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(f), m5p(a))) 'error BC30332: Value of type '1-dimensional array of MT1' cannot be converted to '1-dimensional array of MT6' because 'MT1' is not derived from 'MT6'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(a), m5p(h))) 'error BC30332: Value of type '1-dimensional array of MT8' cannot be converted to '1-dimensional array of MT1' because 'MT8' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(h), m5p(a))) 'error BC30332: Value of type '1-dimensional array of MT1' cannot be converted to '1-dimensional array of MT8' because 'MT1' is not derived from 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(e), m5p(f))) 'error BC30332: Value of type '1-dimensional array of MT6' cannot be converted to '1-dimensional array of MT5' because 'MT6' is not derived from 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(f), m5p(e))) 'error BC30332: Value of type '1-dimensional array of MT5' cannot be converted to '1-dimensional array of MT6' because 'MT5' is not derived from 'MT6'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(e), m5p(h))) 'error BC30332: Value of type '1-dimensional array of MT8' cannot be converted to '1-dimensional array of MT5' because 'MT8' is not derived from 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(h), m5p(e))) 'error BC30332: Value of type '1-dimensional array of MT5' cannot be converted to '1-dimensional array of MT8' because 'MT5' is not derived from 'MT8'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(a), m5p(k))) 'error BC30332: Value of type '1-dimensional array of UInteger' cannot be converted to '1-dimensional array of MT1' because 'UInteger' is not derived from 'MT1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(k), m5p(a))) 'error BC30332: Value of type '1-dimensional array of MT1' cannot be converted to '1-dimensional array of UInteger' because 'MT1' is not derived from 'UInteger'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(e), m5p(k))) 'error BC30332: Value of type '1-dimensional array of UInteger' cannot be converted to '1-dimensional array of MT5' because 'UInteger' is not derived from 'MT5'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(k), m5p(e))) 'error BC30332: Value of type '1-dimensional array of MT5' cannot be converted to '1-dimensional array of UInteger' because 'MT5' is not derived from 'UInteger'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(j), m5p(k))) 'error BC30332: Value of type '1-dimensional array of UInteger' cannot be converted to '1-dimensional array of Integer' because 'UInteger' is not derived from 'Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(k), m5p(j))) 'error BC30332: Value of type '1-dimensional array of Integer' cannot be converted to '1-dimensional array of UInteger' because 'Integer' is not derived from 'UInteger'. Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m5p(m), m5p(n))) Assert.Equal(ConversionKind.WideningArray, ClassifyPredefinedAssignment(m5p(p), m5p(q))) Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(n), m5p(m))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Structure1' to '1-dimensional array of MT10'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(q), m5p(p))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of Class1' to '1-dimensional array of MT12'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(s), m5p(u))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT15' to '1-dimensional array of System.ValueType'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(u), m5p(s))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of System.ValueType' to '1-dimensional array of MT15'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(t), m5p(u))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT15' to '1-dimensional array of MT14'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(u), m5p(t))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT14' to '1-dimensional array of MT15'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(s), m5p(v))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of MT16' to '1-dimensional array of System.ValueType'. Assert.Equal(ConversionKind.NarrowingArray, ClassifyPredefinedAssignment(m5p(v), m5p(s))) 'error BC30512: Option Strict On disallows implicit conversions from '1-dimensional array of System.ValueType' to '1-dimensional array of MT16'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(n), m5p(o))) 'error BC30332: Value of type '1-dimensional array of MT11' cannot be converted to '1-dimensional array of MT10' because 'MT11' is not derived from 'MT10'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(o), m5p(n))) 'error BC30332: Value of type '1-dimensional array of MT10' cannot be converted to '1-dimensional array of MT11' because 'MT10' is not derived from 'MT11'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(q), m5p(r))) 'error BC30332: Value of type '1-dimensional array of MT13' cannot be converted to '1-dimensional array of MT12' because 'MT13' is not derived from 'MT12'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(r), m5p(q))) 'error BC30332: Value of type '1-dimensional array of MT12' cannot be converted to '1-dimensional array of MT13' because 'MT12' is not derived from 'MT13'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(v), m5p(w))) 'error BC30332: Value of type '1-dimensional array of MT17' cannot be converted to '1-dimensional array of MT16' because 'MT17' is not derived from 'MT16'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m5p(w), m5p(v))) 'error BC30332: Value of type '1-dimensional array of MT16' cannot be converted to '1-dimensional array of MT17' because 'MT16' is not derived from 'MT17'. ' ------------- Value Type Dim void = c1.GetSpecialType(System_Void) Dim valueType = c1.GetSpecialType(System_ValueType) Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(void, void))) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment([object], void)) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(void, [object])) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(valueType, void)) Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(void, valueType)) Dim m10 = DirectCast(test.GetMembers("M10").Single(), MethodSymbol) Dim m10p = m10.Parameters.Select(Function(p) p.Type).ToArray() Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m10p(f), m10p(f)))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m10p(a), m10p(f))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m10p(b), m10p(f))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m10p(a), m10p(h))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m10p(b), m10p(h))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m10p(c), m10p(h))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m10p(d), m10p(f))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m10p(i), m10p(f))) Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m10p(f), m10p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'Structure2'. Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m10p(f), m10p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.ValueType' to 'Structure2'. Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m10p(h), m10p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'Enum1'. Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m10p(h), m10p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.ValueType' to 'Enum1'. Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m10p(h), m10p(c))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.Enum' to 'Enum1'. Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m10p(f), m10p(d))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface1' to 'Structure2'. Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m10p(f), m10p(i))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface3' to 'Structure2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(c), m10p(f))) 'error BC30311: Value of type 'Structure2' cannot be converted to 'System.Enum'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(f), m10p(c))) 'error BC30311: Value of type 'System.Enum' cannot be converted to 'Structure2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(d), m10p(h))) 'error BC30311: Value of type 'Enum1' cannot be converted to 'Interface1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(h), m10p(d))) 'error BC30311: Value of type 'Interface1' cannot be converted to 'Enum1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(e), m10p(f))) 'error BC30311: Value of type 'Structure2' cannot be converted to 'Interface7'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(f), m10p(e))) 'error BC30311: Value of type 'Interface7' cannot be converted to 'Structure2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(f), m10p(g))) 'error BC30311: Value of type 'Structure1' cannot be converted to 'Structure2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(g), m10p(f))) 'error BC30311: Value of type 'Structure2' cannot be converted to 'Structure1'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(f), m10p(h))) 'error BC30311: Value of type 'Enum1' cannot be converted to 'Structure2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m10p(h), m10p(f))) 'error BC30311: Value of type 'Structure2' cannot be converted to 'Enum1'. ' ------------ Nullable Dim m11 = DirectCast(test.GetMembers("M11").Single(), MethodSymbol) Dim m11p = m11.Parameters.Select(Function(p) p.Type).ToArray() Assert.True(Conversions.IsIdentityConversion(ClassifyPredefinedAssignment(m11p(d), m11p(d)))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m11p(a), m11p(d))) Assert.Equal(ConversionKind.WideningValue, ClassifyPredefinedAssignment(m11p(b), m11p(d))) Assert.Equal(ConversionKind.WideningNullable, ClassifyPredefinedAssignment(m11p(d), m11p(c))) Assert.Equal(ConversionKind.WideningNullable, ClassifyPredefinedAssignment(m11p(e), m11p(d))) Assert.Equal(ConversionKind.WideningNullable, ClassifyPredefinedAssignment(m11p(f), m11p(d))) Assert.Equal(ConversionKind.WideningNullable, ClassifyPredefinedAssignment(m11p(i), m11p(h))) Assert.Equal(ConversionKind.WideningNullable, ClassifyPredefinedAssignment(m11p(k), m11p(i))) Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m11p(d), m11p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'Object' to 'Structure2?'. Assert.Equal(ConversionKind.NarrowingValue, ClassifyPredefinedAssignment(m11p(d), m11p(b))) 'error BC30512: Option Strict On disallows implicit conversions from 'System.ValueType' to 'Structure2?'. Assert.Equal(ConversionKind.NarrowingNullable, ClassifyPredefinedAssignment(m11p(c), m11p(d))) 'error BC30512: Option Strict On disallows implicit conversions from 'Structure2?' to 'Structure2'. Assert.Equal(ConversionKind.NarrowingNullable, ClassifyPredefinedAssignment(m11p(d), m11p(e))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface1' to 'Structure2?'. Assert.Equal(ConversionKind.NarrowingNullable, ClassifyPredefinedAssignment(m11p(d), m11p(f))) 'error BC30512: Option Strict On disallows implicit conversions from 'Interface3' to 'Structure2?'. Assert.Equal(ConversionKind.NarrowingNullable, ClassifyPredefinedAssignment(m11p(h), m11p(i))) 'error BC30512: Option Strict On disallows implicit conversions from 'Integer?' to 'Integer'. Assert.Equal(ConversionKind.NarrowingNullable, ClassifyPredefinedAssignment(m11p(i), m11p(k))) 'error BC30512: Option Strict On disallows implicit conversions from 'Long?' to 'Integer?'. Assert.Equal(ConversionKind.NarrowingNullable, ClassifyPredefinedAssignment(m11p(i), m11p(j))) 'error BC30512: Option Strict On disallows implicit conversions from 'Long' to 'Integer?'. Assert.Equal(ConversionKind.NarrowingNullable, ClassifyPredefinedAssignment(m11p(j), m11p(i))) 'error BC30512: Option Strict On disallows implicit conversions from 'Integer?' to 'Long'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m11p(c), m11p(i))) 'error BC30311: Value of type 'Integer?' cannot be converted to 'Structure2'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m11p(i), m11p(c))) 'error BC30311: Value of type 'Structure2' cannot be converted to 'Integer?'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m11p(d), m11p(h))) 'error BC30311: Value of type 'Integer' cannot be converted to 'Structure2?'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m11p(h), m11p(d))) 'error BC30311: Value of type 'Structure2?' cannot be converted to 'Integer'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m11p(d), m11p(i))) 'error BC30311: Value of type 'Integer?' cannot be converted to 'Structure2?'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m11p(i), m11p(d))) 'error BC30311: Value of type 'Structure2?' cannot be converted to 'Integer?'. ' ------------ String Dim m12 = DirectCast(test.GetMembers("M12").Single(), MethodSymbol) Dim m12p = m12.Parameters.Select(Function(p) p.Type).ToArray() Assert.Equal(ConversionKind.WideningString, ClassifyPredefinedAssignment(m12p(a), m12p(b))) Assert.Equal(ConversionKind.WideningString, ClassifyPredefinedAssignment(m12p(a), m12p(c))) Assert.Equal(ConversionKind.NarrowingString, ClassifyPredefinedAssignment(m12p(b), m12p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'String' to 'Char'. Assert.Equal(ConversionKind.NarrowingString, ClassifyPredefinedAssignment(m12p(c), m12p(a))) 'error BC30512: Option Strict On disallows implicit conversions from 'String' to '1-dimensional array of Char'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m12p(b), m12p(c))) 'error BC30311: Value of type '1-dimensional array of Char' cannot be converted to 'Char'. Assert.Equal(s_noConversion, ClassifyPredefinedAssignment(m12p(c), m12p(b))) 'error BC30311: Value of type 'Char' cannot be converted to '1-dimensional array of Char'. End Sub Private Shared Function ClassifyPredefinedAssignment([to] As TypeSymbol, [from] As TypeSymbol) As ConversionKind Dim result As ConversionKind = Conversions.ClassifyPredefinedConversion([from], [to], Nothing) And Not ConversionKind.MightSucceedAtRuntime Assert.Equal(result, ClassifyConversion([from], [to])) Return result End Function Public Enum Parameters a b c d e f g h i j k l m n o p q r s t u v w x y z End Enum <Fact()> Public Sub BuiltIn() Dim c1 = VisualBasicCompilation.Create("Test", references:={Net40.References.mscorlib}) Dim nullable = c1.GetSpecialType(System_Nullable_T) Dim types As NamedTypeSymbol() = { c1.GetSpecialType(System_Byte), c1.GetSpecialType(System_SByte), c1.GetSpecialType(System_UInt16), c1.GetSpecialType(System_Int16), c1.GetSpecialType(System_UInt32), c1.GetSpecialType(System_Int32), c1.GetSpecialType(System_UInt64), c1.GetSpecialType(System_Int64), c1.GetSpecialType(System_Decimal), c1.GetSpecialType(System_Single), c1.GetSpecialType(System_Double), c1.GetSpecialType(System_String), c1.GetSpecialType(System_Char), c1.GetSpecialType(System_Boolean), c1.GetSpecialType(System_DateTime), c1.GetSpecialType(System_Object), nullable.Construct(c1.GetSpecialType(System_Byte)), nullable.Construct(c1.GetSpecialType(System_SByte)), nullable.Construct(c1.GetSpecialType(System_UInt16)), nullable.Construct(c1.GetSpecialType(System_Int16)), nullable.Construct(c1.GetSpecialType(System_UInt32)), nullable.Construct(c1.GetSpecialType(System_Int32)), nullable.Construct(c1.GetSpecialType(System_UInt64)), nullable.Construct(c1.GetSpecialType(System_Int64)), nullable.Construct(c1.GetSpecialType(System_Decimal)), nullable.Construct(c1.GetSpecialType(System_Single)), nullable.Construct(c1.GetSpecialType(System_Double)), nullable.Construct(c1.GetSpecialType(System_Char)), nullable.Construct(c1.GetSpecialType(System_Boolean)), nullable.Construct(c1.GetSpecialType(System_DateTime)) } For i As Integer = 0 To types.Length - 1 Step 1 For j As Integer = 0 To types.Length - 1 Step 1 Dim convClass = Conversions.ClassifyPredefinedConversion(types(i), types(j), Nothing) Assert.Equal(convClass, Conversions.ConversionEasyOut.ClassifyPredefinedConversion(types(i), types(j))) Assert.Equal(convClass, ClassifyConversion(types(i), types(j))) If (i = j) Then Assert.True(Conversions.IsIdentityConversion(convClass)) Else Dim baseline = HasBuiltInWideningConversions(types(i), types(j)) If baseline = s_noConversion Then baseline = HasBuiltInNarrowingConversions(types(i), types(j)) End If Assert.Equal(baseline, convClass) End If Next Next End Sub Private Function HasBuiltInWideningConversions(from As TypeSymbol, [to] As TypeSymbol) As ConversionKind Dim result = HasBuiltInWideningConversions(from.SpecialType, [to].SpecialType) If result = s_noConversion Then Dim fromIsNullable = from.IsNullableType() Dim fromElement = If(fromIsNullable, from.GetNullableUnderlyingType(), Nothing) If fromIsNullable AndAlso [to].SpecialType = System_Object Then Return ConversionKind.WideningValue End If Dim toIsNullable = [to].IsNullableType() Dim toElement = If(toIsNullable, [to].GetNullableUnderlyingType(), Nothing) 'Nullable Value Type conversions '• From a type T? to a type S?, where there is a widening conversion from the type T to the type S. If (fromIsNullable AndAlso toIsNullable) Then If (HasBuiltInWideningConversions(fromElement, toElement) And ConversionKind.Widening) <> 0 Then Return ConversionKind.WideningNullable End If End If If (Not fromIsNullable AndAlso toIsNullable) Then '• From a type T to the type T?. If from.Equals(toElement) Then Return ConversionKind.WideningNullable End If '• From a type T to a type S?, where there is a widening conversion from the type T to the type S. If (HasBuiltInWideningConversions(from, toElement) And ConversionKind.Widening) <> 0 Then Return ConversionKind.WideningNullable End If End If End If Return result End Function Private Function HasBuiltInNarrowingConversions(from As TypeSymbol, [to] As TypeSymbol) As ConversionKind Dim result = HasBuiltInNarrowingConversions(from.SpecialType, [to].SpecialType) If result = s_noConversion Then Dim toIsNullable = [to].IsNullableType() Dim toElement = If(toIsNullable, [to].GetNullableUnderlyingType(), Nothing) If from.SpecialType = System_Object AndAlso toIsNullable Then Return ConversionKind.NarrowingValue End If Dim fromIsNullable = from.IsNullableType() Dim fromElement = If(fromIsNullable, from.GetNullableUnderlyingType(), Nothing) 'Nullable Value Type conversions If (fromIsNullable AndAlso Not toIsNullable) Then '• From a type T? to a type T. If fromElement.Equals([to]) Then Return ConversionKind.NarrowingNullable End If '• From a type S? to a type T, where there is a conversion from the type S to the type T. If HasBuiltInWideningConversions(fromElement, [to]) <> s_noConversion OrElse HasBuiltInNarrowingConversions(fromElement, [to]) <> s_noConversion Then Return ConversionKind.NarrowingNullable End If End If '• From a type T? to a type S?, where there is a narrowing conversion from the type T to the type S. If (fromIsNullable AndAlso toIsNullable) Then If (HasBuiltInNarrowingConversions(fromElement, toElement) And ConversionKind.Narrowing) <> 0 Then Return ConversionKind.NarrowingNullable End If End If '• From a type T to a type S?, where there is a narrowing conversion from the type T to the type S. If (Not fromIsNullable AndAlso toIsNullable) Then If (HasBuiltInNarrowingConversions(from, toElement) And ConversionKind.Narrowing) <> 0 Then Return ConversionKind.NarrowingNullable End If End If End If Return result End Function Private Const s_byte = System_Byte Private Const s_SByte = System_SByte Private Const s_UShort = System_UInt16 Private Const s_short = System_Int16 Private Const s_UInteger = System_UInt32 Private Const s_integer = System_Int32 Private Const s_ULong = System_UInt64 Private Const s_long = System_Int64 Private Const s_decimal = System_Decimal Private Const s_single = System_Single Private Const s_double = System_Double Private Const s_string = System_String Private Const s_char = System_Char Private Const s_boolean = System_Boolean Private Const s_date = System_DateTime Private Const s_object = System_Object Private Function HasBuiltInWideningConversions(from As SpecialType, [to] As SpecialType) As ConversionKind Select Case CInt(from) 'Numeric conversions '• From Byte to UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double. Case s_byte Select Case CInt([to]) Case s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single, s_double Return ConversionKind.WideningNumeric End Select '• From SByte to Short, Integer, Long, Decimal, Single, or Double. Case s_SByte Select Case CInt([to]) Case s_short, s_integer, s_long, s_decimal, s_single, s_double Return ConversionKind.WideningNumeric End Select '• From UShort to UInteger, Integer, ULong, Long, Decimal, Single, or Double. Case s_UShort Select Case CInt([to]) Case s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single, s_double Return ConversionKind.WideningNumeric End Select '• From Short to Integer, Long, Decimal, Single or Double. Case s_short Select Case CInt([to]) Case s_integer, s_long, s_decimal, s_single, s_double Return ConversionKind.WideningNumeric End Select '• From UInteger to ULong, Long, Decimal, Single, or Double. Case s_UInteger Select Case CInt([to]) Case s_ULong, s_long, s_decimal, s_single, s_double Return ConversionKind.WideningNumeric End Select '• From Integer to Long, Decimal, Single or Double. Case s_integer Select Case CInt([to]) Case s_long, s_decimal, s_single, s_double Return ConversionKind.WideningNumeric End Select '• From ULong to Decimal, Single, or Double. Case s_ULong Select Case CInt([to]) Case s_decimal, s_single, s_double Return ConversionKind.WideningNumeric End Select '• From Long to Decimal, Single or Double. Case s_long Select Case CInt([to]) Case s_decimal, s_single, s_double Return ConversionKind.WideningNumeric End Select '• From Decimal to Single or Double. Case s_decimal Select Case CInt([to]) Case s_single, s_double Return ConversionKind.WideningNumeric End Select '• From Single to Double. Case s_single Select Case CInt([to]) Case s_double Return ConversionKind.WideningNumeric End Select 'Reference conversions '• From a reference type to a base type. Case s_string Select Case CInt([to]) Case s_object Return ConversionKind.WideningReference End Select 'String conversions '• From Char to String. Case s_char Select Case CInt([to]) Case s_string Return ConversionKind.WideningString End Select End Select Select Case CInt([to]) 'Value Type conversions '• From a value type to a base type. Case s_object Select Case CInt([from]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single, s_double, s_char, s_boolean, s_date Return ConversionKind.WideningValue End Select End Select Return s_noConversion End Function Private Function HasBuiltInNarrowingConversions(from As SpecialType, [to] As SpecialType) As ConversionKind Select Case CInt(from) 'Boolean conversions '• From Boolean to Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double. Case s_boolean Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single, s_double Return ConversionKind.NarrowingBoolean End Select 'Numeric conversions '• From Byte to SByte. Case s_byte Select Case CInt([to]) Case s_SByte Return ConversionKind.NarrowingNumeric End Select '• From SByte to Byte, UShort, UInteger, or ULong. Case s_SByte Select Case CInt([to]) Case s_byte, s_UShort, s_UInteger, s_ULong Return ConversionKind.NarrowingNumeric End Select '• From UShort to Byte, SByte, or Short. Case s_UShort Select Case CInt([to]) Case s_byte, s_SByte, s_short Return ConversionKind.NarrowingNumeric End Select '• From Short to Byte, SByte, UShort, UInteger, or ULong. Case s_short Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_UInteger, s_ULong Return ConversionKind.NarrowingNumeric End Select '• From UInteger to Byte, SByte, UShort, Short, or Integer. Case s_UInteger Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_integer Return ConversionKind.NarrowingNumeric End Select '• From Integer to Byte, SByte, UShort, Short, UInteger, or ULong. Case s_integer Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_ULong Return ConversionKind.NarrowingNumeric End Select '• From ULong to Byte, SByte, UShort, Short, UInteger, Integer, or Long. Case s_ULong Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_long Return ConversionKind.NarrowingNumeric End Select '• From Long to Byte, SByte, UShort, Short, UInteger, Integer, or ULong. Case s_long Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong Return ConversionKind.NarrowingNumeric End Select '• From Decimal to Byte, SByte, UShort, Short, UInteger, Integer, ULong, or Long. Case s_decimal Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long Return ConversionKind.NarrowingNumeric End Select '• From Single to Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, or Decimal. Case s_single Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal Return ConversionKind.NarrowingNumeric End Select '• From Double to Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, or Single. Case s_double Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single Return ConversionKind.NarrowingNumeric End Select 'String conversions '• From String to Char. '• From String to Boolean and from Boolean to String. '• Conversions between String and Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double. '• From String to Date and from Date to String. Case s_string Select Case CInt([to]) Case s_char, s_boolean, s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single, s_double, s_date Return ConversionKind.NarrowingString End Select 'VB Runtime Conversions Case s_object Select Case CInt([to]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single, s_double, s_char, s_boolean, s_date Return ConversionKind.NarrowingValue Case s_string Return ConversionKind.NarrowingReference End Select End Select Select Case CInt([to]) 'Boolean conversions '• From Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double to Boolean. Case s_boolean Select Case CInt([from]) Case s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single, s_double Return ConversionKind.NarrowingBoolean End Select 'String conversions '• From String to Boolean and from Boolean to String. '• Conversions between String and Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double. '• From String to Date and from Date to String. Case s_string Select Case CInt([from]) Case s_boolean, s_byte, s_SByte, s_UShort, s_short, s_UInteger, s_integer, s_ULong, s_long, s_decimal, s_single, s_double, s_date Return ConversionKind.NarrowingString End Select End Select Return s_noConversion End Function <Fact()> Public Sub EnumConversions() CompileAndVerify( <compilation name="VBEnumConversions"> <file name="a.vb"> Option Strict Off Imports System Imports System.Globalization Imports System.Collections.Generic Module Module1 Sub Main() Dim BoFalse As Boolean Dim BoTrue As Boolean Dim SB As SByte Dim By As Byte Dim Sh As Short Dim US As UShort Dim [In] As Integer Dim UI As UInteger Dim Lo As Long Dim UL As ULong Dim De As Decimal Dim Si As Single Dim [Do] As Double Dim St As String Dim Ob As Object Dim Tc As TypeCode Dim TcAsVT As ValueType BoFalse = False BoTrue = True SB = 1 By = 2 Sh = 3 US = 4 [In] = 5 UI = 6 Lo = 7 UL = 8 Si = 10 [Do] = 11 De = 9D St = "12" Ob = 13 Tc = TypeCode.Decimal TcAsVT = Tc System.Console.WriteLine("Conversions to enum:") PrintResultTc(BoFalse) PrintResultTc(BoTrue) PrintResultTc(SB) PrintResultTc(By) PrintResultTc(Sh) PrintResultTc(US) PrintResultTc([In]) PrintResultTc(UI) PrintResultTc(Lo) PrintResultTc(UL) PrintResultTc(Si) PrintResultTc([Do]) PrintResultTc(De) PrintResultTc(Ob) PrintResultTc(St) PrintResultTc(TcAsVT) System.Console.WriteLine() System.Console.WriteLine("Conversions from enum:") PrintResultBo(Tc) PrintResultSB(Tc) PrintResultBy(Tc) PrintResultSh(Tc) PrintResultUs(Tc) PrintResultIn(Tc) PrintResultUI(Tc) PrintResultLo(Tc) PrintResultUL(Tc) PrintResultSi(Tc) PrintResultDo(Tc) PrintResultDe(Tc) PrintResultOb(Tc) PrintResultSt(Tc) PrintResultValueType(Tc) End Sub Sub PrintResultTc(val As TypeCode) System.Console.WriteLine("TypeCode: {0}", val) End Sub Sub PrintResultBo(val As Boolean) System.Console.WriteLine("Boolean: {0}", val) End Sub Sub PrintResultSB(val As SByte) System.Console.WriteLine("SByte: {0}", val) End Sub Sub PrintResultBy(val As Byte) System.Console.WriteLine("Byte: {0}", val) End Sub Sub PrintResultSh(val As Short) System.Console.WriteLine("Short: {0}", val) End Sub Sub PrintResultUs(val As UShort) System.Console.WriteLine("UShort: {0}", val) End Sub Sub PrintResultIn(val As Integer) System.Console.WriteLine("Integer: {0}", val) End Sub Sub PrintResultUI(val As UInteger) System.Console.WriteLine("UInteger: {0}", val) End Sub Sub PrintResultLo(val As Long) System.Console.WriteLine("Long: {0}", val) End Sub Sub PrintResultUL(val As ULong) System.Console.WriteLine("ULong: {0}", val) End Sub Sub PrintResultDe(val As Decimal) System.Console.WriteLine("Decimal: {0}", val) End Sub Sub PrintResultSi(val As Single) System.Console.WriteLine("Single: {0}", val) End Sub Sub PrintResultDo(val As Double) System.Console.WriteLine("Double: {0}", val) End Sub Sub PrintResultSt(val As String) System.Console.WriteLine("String: {0}", val) End Sub Sub PrintResultOb(val As Object) System.Console.WriteLine("Object: {0}", val) End Sub Sub PrintResultValueType(val As ValueType) System.Console.WriteLine("ValueType: {0}", val) End Sub End Module </file> </compilation>, expectedOutput:=<![CDATA[ Conversions to enum: TypeCode: Empty TypeCode: -1 TypeCode: Object TypeCode: DBNull TypeCode: Boolean TypeCode: Char TypeCode: SByte TypeCode: Byte TypeCode: Int16 TypeCode: UInt16 TypeCode: UInt32 TypeCode: Int64 TypeCode: Int32 TypeCode: Single TypeCode: UInt64 TypeCode: Decimal Conversions from enum: Boolean: True SByte: 15 Byte: 15 Short: 15 UShort: 15 Integer: 15 UInteger: 15 Long: 15 ULong: 15 Single: 15 Double: 15 Decimal: 15 Object: Decimal String: 15 ValueType: Decimal ]]>) End Sub <Fact()> Public Sub ConversionDiagnostic1() Dim compilationDef = <compilation name="VBConversionsDiagnostic1"> <file name="a.vb"> Imports System Module Module1 Sub Main() Dim [In] As Integer [In] = Console.WriteLine() [In] = CType(Console.WriteLine(), Integer) [In] = CType(1, UnknownType) [In] = CType(unknownValue, Integer) [In] = CType(unknownValue, UnknownType) Dim tr As System.TypedReference = Nothing Dim ai As System.ArgIterator = Nothing Dim ra As System.RuntimeArgumentHandle = Nothing Dim Ob As Object Ob = tr Ob = ai Ob = ra Ob = CType(tr, Object) Ob = CType(ai, Object) Ob = CType(ra, Object) Dim vt As ValueType vt = tr vt = ai vt = ra vt = CType(tr, ValueType) vt = CType(ai, ValueType) vt = CType(ra, ValueType) Dim collection As Microsoft.VisualBasic.Collection = Nothing Dim _collection As _Collection = Nothing collection = _collection _collection = collection collection = CType(_collection, Microsoft.VisualBasic.Collection) _collection = CType(collection, _Collection) Dim Si As Single Dim De As Decimal [In] = Int64.MaxValue [In] = CInt(Int64.MaxValue) Si = System.Double.MaxValue Si = CSng(System.Double.MaxValue) De = System.Double.MaxValue De = CDec(System.Double.MaxValue) De = 10.0F De = CDec(10.0F) Dim Da As DateTime = Nothing [In] = Da [In] = CInt(Da) Da = [In] Da = CDate([In]) Dim [Do] As Double = Nothing Dim Ch As Char = Nothing [Do] = Da [Do] = CDbl(Da) Da = [Do] Da = CDate([Do]) [In] = Ch [In] = CInt(Ch) Ch = [In] Ch = CChar([In]) Dim InArray As Integer() = Nothing Dim ObArray As Object() = Nothing Dim VtArray As ValueType() = Nothing ObArray = InArray ObArray = CType(InArray, Object()) VtArray = InArray VtArray = CType(InArray, ValueType()) Dim TC1Array As TestClass1() = Nothing Dim TC2Array As TestClass2() = Nothing TC1Array = TC2Array TC2Array = CType(TC1Array, TestClass2()) Dim InArray2 As Integer(,) = Nothing InArray = InArray2 InArray2 = CType(InArray, Integer(,)) Dim TI1Array As TestInterface1() = Nothing InArray = TI1Array TI1Array = CType(InArray, TestInterface1()) End Sub End Module Interface TestInterface1 End Interface Interface _Collection End Interface Class TestClass1 End Class Class TestClass2 End Class </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionStrict(OptionStrict.On)) compilation.VerifyDiagnostics( Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.ERR_NarrowingConversionCollection2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.ERR_NarrowingConversionCollection2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "Int64.MaxValue").WithArguments("Integer"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "Int64.MaxValue").WithArguments("Integer"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "System.Double.MaxValue").WithArguments("Decimal"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "System.Double.MaxValue").WithArguments("Decimal"), Diagnostic(ERRID.ERR_NarrowingConversionDisallowed2, "10.0F").WithArguments("Single", "Decimal"), Diagnostic(ERRID.ERR_TypeMismatch2, "Da").WithArguments("Date", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "Da").WithArguments("Date", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "[In]").WithArguments("Integer", "Date"), Diagnostic(ERRID.ERR_TypeMismatch2, "[In]").WithArguments("Integer", "Date"), Diagnostic(ERRID.ERR_DateToDoubleConversion, "Da"), Diagnostic(ERRID.ERR_DateToDoubleConversion, "Da"), Diagnostic(ERRID.ERR_DoubleToDateConversion, "[Do]"), Diagnostic(ERRID.ERR_DoubleToDateConversion, "[Do]"), Diagnostic(ERRID.ERR_CharToIntegralTypeMismatch1, "Ch").WithArguments("Integer"), Diagnostic(ERRID.ERR_CharToIntegralTypeMismatch1, "Ch").WithArguments("Integer"), Diagnostic(ERRID.ERR_IntegralToCharTypeMismatch1, "[In]").WithArguments("Integer"), Diagnostic(ERRID.ERR_IntegralToCharTypeMismatch1, "[In]").WithArguments("Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC2Array").WithArguments("TestClass2()", "TestClass1()", "TestClass2", "TestClass1"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC1Array").WithArguments("TestClass1()", "TestClass2()", "TestClass1", "TestClass2"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray2").WithArguments("Integer(*,*)", "Integer()"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray").WithArguments("Integer()", "Integer(*,*)"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TI1Array").WithArguments("TestInterface1()", "Integer()", "TestInterface1", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "InArray").WithArguments("Integer()", "TestInterface1()", "Integer", "TestInterface1")) compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionStrict(OptionStrict.Off)) compilation.VerifyDiagnostics( Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "Int64.MaxValue").WithArguments("Integer"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "Int64.MaxValue").WithArguments("Integer"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "System.Double.MaxValue").WithArguments("Decimal"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "System.Double.MaxValue").WithArguments("Decimal"), Diagnostic(ERRID.ERR_TypeMismatch2, "Da").WithArguments("Date", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "Da").WithArguments("Date", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "[In]").WithArguments("Integer", "Date"), Diagnostic(ERRID.ERR_TypeMismatch2, "[In]").WithArguments("Integer", "Date"), Diagnostic(ERRID.ERR_DateToDoubleConversion, "Da"), Diagnostic(ERRID.ERR_DateToDoubleConversion, "Da"), Diagnostic(ERRID.ERR_DoubleToDateConversion, "[Do]"), Diagnostic(ERRID.ERR_DoubleToDateConversion, "[Do]"), Diagnostic(ERRID.ERR_CharToIntegralTypeMismatch1, "Ch").WithArguments("Integer"), Diagnostic(ERRID.ERR_CharToIntegralTypeMismatch1, "Ch").WithArguments("Integer"), Diagnostic(ERRID.ERR_IntegralToCharTypeMismatch1, "[In]").WithArguments("Integer"), Diagnostic(ERRID.ERR_IntegralToCharTypeMismatch1, "[In]").WithArguments("Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC2Array").WithArguments("TestClass2()", "TestClass1()", "TestClass2", "TestClass1"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC1Array").WithArguments("TestClass1()", "TestClass2()", "TestClass1", "TestClass2"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray2").WithArguments("Integer(*,*)", "Integer()"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray").WithArguments("Integer()", "Integer(*,*)"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TI1Array").WithArguments("TestInterface1()", "Integer()", "TestInterface1", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "InArray").WithArguments("Integer()", "TestInterface1()", "Integer", "TestInterface1")) compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionStrict(OptionStrict.Custom)) compilation.VerifyDiagnostics( Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_ImplicitConversionSubst1, "_collection").WithArguments("Implicit conversion from '_Collection' to 'Collection'."), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.WRN_ImplicitConversionSubst1, "collection").WithArguments("Implicit conversion from 'Collection' to '_Collection'."), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "Int64.MaxValue").WithArguments("Integer"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "Int64.MaxValue").WithArguments("Integer"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "System.Double.MaxValue").WithArguments("Decimal"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "System.Double.MaxValue").WithArguments("Decimal"), Diagnostic(ERRID.WRN_ImplicitConversionSubst1, "10.0F").WithArguments("Implicit conversion from 'Single' to 'Decimal'."), Diagnostic(ERRID.ERR_TypeMismatch2, "Da").WithArguments("Date", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "Da").WithArguments("Date", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "[In]").WithArguments("Integer", "Date"), Diagnostic(ERRID.ERR_TypeMismatch2, "[In]").WithArguments("Integer", "Date"), Diagnostic(ERRID.ERR_DateToDoubleConversion, "Da"), Diagnostic(ERRID.ERR_DateToDoubleConversion, "Da"), Diagnostic(ERRID.ERR_DoubleToDateConversion, "[Do]"), Diagnostic(ERRID.ERR_DoubleToDateConversion, "[Do]"), Diagnostic(ERRID.ERR_CharToIntegralTypeMismatch1, "Ch").WithArguments("Integer"), Diagnostic(ERRID.ERR_CharToIntegralTypeMismatch1, "Ch").WithArguments("Integer"), Diagnostic(ERRID.ERR_IntegralToCharTypeMismatch1, "[In]").WithArguments("Integer"), Diagnostic(ERRID.ERR_IntegralToCharTypeMismatch1, "[In]").WithArguments("Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC2Array").WithArguments("TestClass2()", "TestClass1()", "TestClass2", "TestClass1"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC1Array").WithArguments("TestClass1()", "TestClass2()", "TestClass1", "TestClass2"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray2").WithArguments("Integer(*,*)", "Integer()"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray").WithArguments("Integer()", "Integer(*,*)"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TI1Array").WithArguments("TestInterface1()", "Integer()", "TestInterface1", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "InArray").WithArguments("Integer()", "TestInterface1()", "Integer", "TestInterface1")) End Sub <Fact()> Public Sub DirectCastDiagnostic1() Dim compilationDef = <compilation name="DirectCastDiagnostic1"> <file name="a.vb"> Imports System Module Module1 Sub Main() Dim [In] As Integer [In] = DirectCast(Console.WriteLine(), Integer) [In] = DirectCast(1, UnknownType) [In] = DirectCast(unknownValue, Integer) [In] = DirectCast(unknownValue, UnknownType) Dim tr As System.TypedReference = Nothing Dim ai As System.ArgIterator = Nothing Dim ra As System.RuntimeArgumentHandle = Nothing Dim Ob As Object Ob = DirectCast(tr, Object) Ob = DirectCast(ai, Object) Ob = DirectCast(ra, Object) Dim vt As ValueType vt = DirectCast(tr, ValueType) vt = DirectCast(ai, ValueType) vt = DirectCast(ra, ValueType) Dim collection As Microsoft.VisualBasic.Collection = Nothing Dim _collection As _Collection = Nothing collection = DirectCast(_collection, Microsoft.VisualBasic.Collection) _collection = DirectCast(collection, _Collection) Dim Si As Single Dim De As Decimal [In] = DirectCast(Int64.MaxValue, Int32) De = DirectCast(System.Double.MaxValue, System.Decimal) Dim Da As DateTime = Nothing [In] = DirectCast(Da, Int32) Da = DirectCast([In], DateTime) Dim [Do] As Double = Nothing Dim Ch As Char = Nothing [Do] = DirectCast(Da, System.Double) Da = DirectCast([Do], DateTime) [In] = DirectCast(Ch, Int32) Ch = DirectCast([In], System.Char) Dim InArray As Integer() = Nothing Dim ObArray As Object() = Nothing Dim VtArray As ValueType() = Nothing ObArray = DirectCast(InArray, Object()) VtArray = DirectCast(InArray, ValueType()) Dim TC1Array As TestClass1() = Nothing Dim TC2Array As TestClass2() = Nothing TC2Array = DirectCast(TC1Array, TestClass2()) Dim InArray2 As Integer(,) = Nothing InArray2 = DirectCast(InArray, Integer(,)) Dim TI1Array As TestInterface1() = Nothing TI1Array = DirectCast(InArray, TestInterface1()) Dim St As String = Nothing Dim ChArray As Char() = Nothing Ch = DirectCast(St, System.Char) St = DirectCast(Ch, System.String) St = DirectCast(ChArray, System.String) ChArray = DirectCast(St, System.Char()) [In] = DirectCast([In], System.Int32) Si = DirectCast(Si, System.Single) [Do] = DirectCast([Do], System.Double) [Do] = DirectCast(Si, System.Double) End Sub End Module Interface TestInterface1 End Interface Interface _Collection End Interface Class TestClass1 End Class Class TestClass2 End Class </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionStrict(OptionStrict.On)) compilation.VerifyDiagnostics( Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.ERR_TypeMismatch2, "Int64.MaxValue").WithArguments("Long", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "System.Double.MaxValue").WithArguments("Double", "Decimal"), Diagnostic(ERRID.ERR_TypeMismatch2, "Da").WithArguments("Date", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "[In]").WithArguments("Integer", "Date"), Diagnostic(ERRID.ERR_DateToDoubleConversion, "Da"), Diagnostic(ERRID.ERR_DoubleToDateConversion, "[Do]"), Diagnostic(ERRID.ERR_CharToIntegralTypeMismatch1, "Ch").WithArguments("Integer"), Diagnostic(ERRID.ERR_IntegralToCharTypeMismatch1, "[In]").WithArguments("Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC1Array").WithArguments("TestClass1()", "TestClass2()", "TestClass1", "TestClass2"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray").WithArguments("Integer()", "Integer(*,*)"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "InArray").WithArguments("Integer()", "TestInterface1()", "Integer", "TestInterface1"), Diagnostic(ERRID.ERR_TypeMismatch2, "St").WithArguments("String", "Char"), Diagnostic(ERRID.ERR_TypeMismatch2, "Ch").WithArguments("Char", "String"), Diagnostic(ERRID.ERR_TypeMismatch2, "ChArray").WithArguments("Char()", "String"), Diagnostic(ERRID.ERR_TypeMismatch2, "St").WithArguments("String", "Char()"), Diagnostic(ERRID.WRN_ObsoleteIdentityDirectCastForValueType, "[In]"), Diagnostic(ERRID.ERR_IdentityDirectCastForFloat, "Si"), Diagnostic(ERRID.ERR_IdentityDirectCastForFloat, "[Do]"), Diagnostic(ERRID.ERR_TypeMismatch2, "Si").WithArguments("Single", "Double")) compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionStrict(OptionStrict.Off)) compilation.VerifyDiagnostics( Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.ERR_TypeMismatch2, "Int64.MaxValue").WithArguments("Long", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "System.Double.MaxValue").WithArguments("Double", "Decimal"), Diagnostic(ERRID.ERR_TypeMismatch2, "Da").WithArguments("Date", "Integer"), Diagnostic(ERRID.ERR_TypeMismatch2, "[In]").WithArguments("Integer", "Date"), Diagnostic(ERRID.ERR_DateToDoubleConversion, "Da"), Diagnostic(ERRID.ERR_DoubleToDateConversion, "[Do]"), Diagnostic(ERRID.ERR_CharToIntegralTypeMismatch1, "Ch").WithArguments("Integer"), Diagnostic(ERRID.ERR_IntegralToCharTypeMismatch1, "[In]").WithArguments("Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC1Array").WithArguments("TestClass1()", "TestClass2()", "TestClass1", "TestClass2"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray").WithArguments("Integer()", "Integer(*,*)"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "InArray").WithArguments("Integer()", "TestInterface1()", "Integer", "TestInterface1"), Diagnostic(ERRID.ERR_TypeMismatch2, "St").WithArguments("String", "Char"), Diagnostic(ERRID.ERR_TypeMismatch2, "Ch").WithArguments("Char", "String"), Diagnostic(ERRID.ERR_TypeMismatch2, "ChArray").WithArguments("Char()", "String"), Diagnostic(ERRID.ERR_TypeMismatch2, "St").WithArguments("String", "Char()"), Diagnostic(ERRID.WRN_ObsoleteIdentityDirectCastForValueType, "[In]"), Diagnostic(ERRID.ERR_IdentityDirectCastForFloat, "Si"), Diagnostic(ERRID.ERR_IdentityDirectCastForFloat, "[Do]"), Diagnostic(ERRID.ERR_TypeMismatch2, "Si").WithArguments("Single", "Double")) End Sub <Fact()> Public Sub TryCastDiagnostic1() Dim compilationDef = <compilation name="TryCastDiagnostic1"> <file name="a.vb"> Imports System Module Module1 Sub Main() Dim [In] As Integer [In] = TryCast(Console.WriteLine(), Integer) [In] = TryCast(1, UnknownType) [In] = TryCast(unknownValue, Integer) [In] = TryCast(unknownValue, UnknownType) Dim tr As System.TypedReference = Nothing Dim ai As System.ArgIterator = Nothing Dim ra As System.RuntimeArgumentHandle = Nothing Dim Ob As Object Ob = TryCast(tr, Object) Ob = TryCast(ai, Object) Ob = TryCast(ra, Object) Dim vt As ValueType vt = TryCast(tr, ValueType) vt = TryCast(ai, ValueType) vt = TryCast(ra, ValueType) Dim collection As Microsoft.VisualBasic.Collection = Nothing Dim _collection As _Collection = Nothing collection = TryCast(_collection, Microsoft.VisualBasic.Collection) _collection = TryCast(collection, _Collection) Dim De As Decimal [In] = TryCast(Int64.MaxValue, Int32) De = TryCast(System.Double.MaxValue, System.Decimal) Dim Ch As Char = Nothing Dim InArray As Integer() = Nothing Dim ObArray As Object() = Nothing Dim VtArray As ValueType() = Nothing ObArray = TryCast(InArray, Object()) VtArray = TryCast(InArray, ValueType()) Dim TC1Array As TestClass1() = Nothing Dim TC2Array As TestClass2() = Nothing TC2Array = TryCast(TC1Array, TestClass2()) Dim InArray2 As Integer(,) = Nothing InArray2 = TryCast(InArray, Integer(,)) Dim TI1Array As TestInterface1() = Nothing TI1Array = TryCast(InArray, TestInterface1()) Dim St As String = Nothing Dim ChArray As Char() = Nothing Ch = TryCast(St, System.Char) St = TryCast(Ch, System.String) St = TryCast(ChArray, System.String) ChArray = TryCast(St, System.Char()) End Sub End Module Interface TestInterface1 End Interface Interface _Collection End Interface Class TestClass1 End Class Class TestClass2 End Class Class TestClass3(Of T) Sub Test(val As Object) Dim x As T = TryCast(val, T) End Sub End Class </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionStrict(OptionStrict.On)) compilation.VerifyDiagnostics( Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.ERR_TryCastOfValueType1, "Int32").WithArguments("Integer"), Diagnostic(ERRID.ERR_TryCastOfValueType1, "System.Decimal").WithArguments("Decimal"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC1Array").WithArguments("TestClass1()", "TestClass2()", "TestClass1", "TestClass2"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray").WithArguments("Integer()", "Integer(*,*)"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "InArray").WithArguments("Integer()", "TestInterface1()", "Integer", "TestInterface1"), Diagnostic(ERRID.ERR_TryCastOfValueType1, "System.Char").WithArguments("Char"), Diagnostic(ERRID.ERR_TypeMismatch2, "Ch").WithArguments("Char", "String"), Diagnostic(ERRID.ERR_TypeMismatch2, "ChArray").WithArguments("Char()", "String"), Diagnostic(ERRID.ERR_TypeMismatch2, "St").WithArguments("String", "Char()"), Diagnostic(ERRID.ERR_TryCastOfUnconstrainedTypeParam1, "T").WithArguments("T")) compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionStrict(OptionStrict.Off)) compilation.VerifyDiagnostics( Diagnostic(ERRID.ERR_VoidValue, "Console.WriteLine()"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_NameNotDeclared1, "unknownValue").WithArguments("unknownValue"), Diagnostic(ERRID.ERR_UndefinedType1, "UnknownType").WithArguments("UnknownType"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.ERR_RestrictedConversion1, "tr").WithArguments("System.TypedReference"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ai").WithArguments("System.ArgIterator"), Diagnostic(ERRID.ERR_RestrictedConversion1, "ra").WithArguments("System.RuntimeArgumentHandle"), Diagnostic(ERRID.WRN_InterfaceConversion2, "_collection").WithArguments("_Collection", "Microsoft.VisualBasic.Collection"), Diagnostic(ERRID.WRN_InterfaceConversion2, "collection").WithArguments("Microsoft.VisualBasic.Collection", "_Collection"), Diagnostic(ERRID.ERR_TryCastOfValueType1, "Int32").WithArguments("Integer"), Diagnostic(ERRID.ERR_TryCastOfValueType1, "System.Decimal").WithArguments("Decimal"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "Object()", "Integer"), Diagnostic(ERRID.ERR_ConvertObjectArrayMismatch3, "InArray").WithArguments("Integer()", "System.ValueType()", "Integer"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "TC1Array").WithArguments("TestClass1()", "TestClass2()", "TestClass1", "TestClass2"), Diagnostic(ERRID.ERR_ConvertArrayRankMismatch2, "InArray").WithArguments("Integer()", "Integer(*,*)"), Diagnostic(ERRID.ERR_ConvertArrayMismatch4, "InArray").WithArguments("Integer()", "TestInterface1()", "Integer", "TestInterface1"), Diagnostic(ERRID.ERR_TryCastOfValueType1, "System.Char").WithArguments("Char"), Diagnostic(ERRID.ERR_TypeMismatch2, "Ch").WithArguments("Char", "String"), Diagnostic(ERRID.ERR_TypeMismatch2, "ChArray").WithArguments("Char()", "String"), Diagnostic(ERRID.ERR_TypeMismatch2, "St").WithArguments("String", "Char()"), Diagnostic(ERRID.ERR_TryCastOfUnconstrainedTypeParam1, "T").WithArguments("T")) End Sub <Fact()> Public Sub ExplicitConversions1() ' the argument past to CDate("") is following system setting, ' so "1/2/2012" could be Jan 2nd OR Feb 1st Dim currCulture = System.Threading.Thread.CurrentThread.CurrentCulture System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US") Try Dim compilationDef = <compilation name="VBExplicitConversions1"> <file name="lib.vb"> <%= SemanticResourceUtil.PrintResultTestSource %> </file> <file name="a.vb"> Option Strict Off Imports System Imports System.Collections.Generic Module Module1 Sub Main() PrintResult(CObj(Nothing)) PrintResult(CBool(Nothing)) PrintResult(CByte(Nothing)) 'PrintResult(CChar(Nothing)) PrintResult(CDate(Nothing)) PrintResult(CDec(Nothing)) PrintResult(CDbl(Nothing)) PrintResult(CInt(Nothing)) PrintResult(CLng(Nothing)) PrintResult(CSByte(Nothing)) PrintResult(CShort(Nothing)) PrintResult(CSng(Nothing)) PrintResult(CStr(Nothing)) PrintResult(CUInt(Nothing)) PrintResult(CULng(Nothing)) PrintResult(CUShort(Nothing)) PrintResult(CType(Nothing, System.Object)) PrintResult(CType(Nothing, System.Boolean)) PrintResult(CType(Nothing, System.Byte)) 'PrintResult(CType(Nothing, System.Char)) PrintResult(CType(Nothing, System.DateTime)) PrintResult(CType(Nothing, System.Decimal)) PrintResult(CType(Nothing, System.Double)) PrintResult(CType(Nothing, System.Int32)) PrintResult(CType(Nothing, System.Int64)) PrintResult(CType(Nothing, System.SByte)) PrintResult(CType(Nothing, System.Int16)) PrintResult(CType(Nothing, System.Single)) PrintResult(CType(Nothing, System.String)) PrintResult(CType(Nothing, System.UInt32)) PrintResult(CType(Nothing, System.UInt64)) PrintResult(CType(Nothing, System.UInt16)) PrintResult(CType(Nothing, System.Guid)) PrintResult(CType(Nothing, System.ValueType)) PrintResult(CByte(300)) PrintResult(CObj("String")) PrintResult(CBool("False")) PrintResult(CByte("1")) PrintResult(CChar("a")) PrintResult(CDate("11/12/2001 12:00:00 AM")) PrintResult(CDec("-2")) PrintResult(CDbl("3")) PrintResult(CInt("-4")) PrintResult(CLng("5")) PrintResult(CSByte("-6")) PrintResult(CShort("7")) PrintResult(CSng("-8")) PrintResult(CStr(9)) PrintResult(CUInt("10")) PrintResult(CULng("11")) PrintResult(CUShort("12")) End Sub Function Int32ToInt32(val As System.Int32) As Int32 Return CInt(val) End Function Function SingleToSingle(val As System.Single) As Single Return CSng(val) End Function Function DoubleToDouble(val As System.Double) As Double Return CDbl(val) End Function End Module </file> </compilation> CompileAndVerify(compilationDef, options:=TestOptions.ReleaseExe.WithOverflowChecks(False), expectedOutput:=<![CDATA[ Object: [] Boolean: False Byte: 0 Date: 1/1/0001 12:00:00 AM Decimal: 0 Double: 0 Integer: 0 Long: 0 SByte: 0 Short: 0 Single: 0 String: [] UInteger: 0 ULong: 0 UShort: 0 Object: [] Boolean: False Byte: 0 Date: 1/1/0001 12:00:00 AM Decimal: 0 Double: 0 Integer: 0 Long: 0 SByte: 0 Short: 0 Single: 0 String: [] UInteger: 0 ULong: 0 UShort: 0 Guid: 00000000-0000-0000-0000-000000000000 ValueType: [] Byte: 44 Object: [String] Boolean: False Byte: 1 Char: [a] Date: 11/12/2001 12:00:00 AM Decimal: -2 Double: 3 Integer: -4 Long: 5 SByte: -6 Short: 7 Single: -8 String: [9] UInteger: 10 ULong: 11 UShort: 12 ]]>). VerifyIL("Module1.Int32ToInt32", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldarg.0 IL_0001: ret } ]]>). VerifyIL("Module1.SingleToSingle", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldarg.0 IL_0001: ret } ]]>). VerifyIL("Module1.DoubleToDouble", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldarg.0 IL_0001: ret } ]]>) Catch ex As Exception Finally System.Threading.Thread.CurrentThread.CurrentCulture = currCulture End Try End Sub <Fact()> Public Sub DirectCast1() Dim compilationDef = <compilation name="DirectCast1"> <file name="helper.vb"><%= SemanticResourceUtil.PrintResultTestSource %></file> <file name="a.vb"> Option Strict Off Imports System Imports System.Globalization Imports System.Collections.Generic Module Module1 Sub Main() PrintResult(DirectCast(Nothing, System.Object)) PrintResult(DirectCast(Nothing, System.Boolean)) PrintResult(DirectCast(Nothing, System.Byte)) PrintResult(DirectCast(Nothing, System.DateTime)) PrintResult(DirectCast(Nothing, System.Decimal)) PrintResult(DirectCast(Nothing, System.Double)) PrintResult(DirectCast(Nothing, System.Int32)) PrintResult(DirectCast(Nothing, System.Int64)) PrintResult(DirectCast(Nothing, System.SByte)) PrintResult(DirectCast(Nothing, System.Int16)) PrintResult(DirectCast(Nothing, System.Single)) PrintResult(DirectCast(Nothing, System.String)) PrintResult(DirectCast(Nothing, System.UInt32)) PrintResult(DirectCast(Nothing, System.UInt64)) PrintResult(DirectCast(Nothing, System.UInt16)) PrintResult(DirectCast(Nothing, System.ValueType)) PrintResult(DirectCast(1, System.Object)) PrintResult(DirectCast(3.5R, System.ValueType)) Dim guid As Guid = New Guid("8c5dffd5-1778-4dd3-a9f5-6a9708146a7c") Dim guidObject As Object = guid PrintResult(DirectCast(guid, System.Object)) PrintResult(DirectCast(guidObject, System.Guid)) PrintResult(DirectCast("abc", System.IComparable)) PrintResult(GenericParamTestHelperOfString.NothingToT()) 'PrintResult(DirectCast(Nothing, System.Guid)) PrintResult(GenericParamTestHelperOfGuid.NothingToT()) PrintResult(GenericParamTestHelperOfString.TToObject("abcd")) PrintResult(GenericParamTestHelperOfString.TToObject(Nothing)) PrintResult(GenericParamTestHelperOfGuid.TToObject(guid)) PrintResult(GenericParamTestHelperOfString.TToIComparable("abcde")) PrintResult(GenericParamTestHelperOfString.TToIComparable(Nothing)) PrintResult(GenericParamTestHelperOfGuid.TToIComparable(guid)) PrintResult(GenericParamTestHelperOfGuid.ObjectToT(guidObject)) 'PrintResult(GenericParamTestHelperOfGuid.ObjectToT(Nothing)) PrintResult(GenericParamTestHelperOfString.ObjectToT("ObString")) PrintResult(GenericParamTestHelperOfString.ObjectToT(Nothing)) 'PrintResult(GenericParamTestHelper(Of System.Int32).ObjectToT(Nothing)) PrintResult(GenericParamTestHelperOfString.IComparableToT("abcde")) PrintResult(GenericParamTestHelperOfString.IComparableToT(Nothing)) PrintResult(GenericParamTestHelperOfGuid.IComparableToT(guid)) 'PrintResult(GenericParamTestHelperOfGuid.IComparableToT(Nothing)) 'PrintResult(GenericParamTestHelper(Of System.Double).IComparableToT(Nothing)) Dim [In] As Integer = 23 Dim De As Decimal = 24 PrintResult(DirectCast([In], System.Int32)) PrintResult(DirectCast(De, System.Decimal)) End Sub Function NothingToGuid() As Guid Return DirectCast(Nothing, System.Guid) End Function Function NothingToInt32() As Int32 Return DirectCast(Nothing, System.Int32) End Function Function Int32ToInt32(val As System.Int32) As Int32 Return DirectCast(val, System.Int32) End Function Class GenericParamTestHelper(Of T) Public Shared Function ObjectToT(val As Object) As T Return DirectCast(val, T) End Function Public Shared Function TToObject(val As T) As Object Return DirectCast(val, Object) End Function Public Shared Function TToIComparable(val As T) As IComparable Return DirectCast(val, IComparable) End Function Public Shared Function IComparableToT(val As IComparable) As T Return DirectCast(val, T) End Function Public Shared Function NothingToT() As T Return DirectCast(Nothing, T) End Function End Class Class GenericParamTestHelperOfString Inherits GenericParamTestHelper(Of String) End Class Class GenericParamTestHelperOfGuid Inherits GenericParamTestHelper(Of Guid) End Class End Module </file> </compilation> CompileAndVerify(compilationDef, expectedOutput:=<![CDATA[ Object: [] Boolean: False Byte: 0 Date: 1/1/0001 12:00:00 AM Decimal: 0 Double: 0 Integer: 0 Long: 0 SByte: 0 Short: 0 Single: 0 String: [] UInteger: 0 ULong: 0 UShort: 0 ValueType: [] Object: [1] ValueType: [3.5] Object: [8c5dffd5-1778-4dd3-a9f5-6a9708146a7c] Guid: 8c5dffd5-1778-4dd3-a9f5-6a9708146a7c IComparable: [abc] String: [] Guid: 00000000-0000-0000-0000-000000000000 Object: [abcd] Object: [] Object: [8c5dffd5-1778-4dd3-a9f5-6a9708146a7c] IComparable: [abcde] IComparable: [] IComparable: [8c5dffd5-1778-4dd3-a9f5-6a9708146a7c] Guid: 8c5dffd5-1778-4dd3-a9f5-6a9708146a7c String: [ObString] String: [] String: [abcde] String: [] Guid: 8c5dffd5-1778-4dd3-a9f5-6a9708146a7c Integer: 23 Decimal: 24 ]]>). VerifyIL("Module1.NothingToGuid", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldnull IL_0001: unbox.any "System.Guid" IL_0006: ret } ]]>). VerifyIL("Module1.NothingToInt32", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldc.i4.0 IL_0001: ret } ]]>). VerifyIL("Module1.Int32ToInt32", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldarg.0 IL_0001: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper(Of T).ObjectToT", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: unbox.any "T" IL_0006: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper(Of T).TToObject", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: box "T" IL_0006: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper(Of T).TToIComparable", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: box "T" IL_0006: castclass "System.IComparable" IL_000b: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper(Of T).IComparableToT", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: unbox.any "T" IL_0006: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper(Of T).NothingToT", <![CDATA[ { // Code size 10 (0xa) .maxstack 1 .locals init (T V_0) IL_0000: ldloca.s V_0 IL_0002: initobj "T" IL_0008: ldloc.0 IL_0009: ret } ]]>) End Sub <Fact()> Public Sub TryCast1() Dim compilationDef = <compilation name="TryCast1"> <file name="helper.vb"><%= SemanticResourceUtil.PrintResultTestSource %></file> <file name="a.vb"> Option Strict Off Imports System Imports System.Globalization Imports System.Collections.Generic Module Module1 Sub Main() PrintResult(TryCast(Nothing, System.Object)) PrintResult(TryCast(Nothing, System.String)) PrintResult(TryCast(Nothing, System.ValueType)) PrintResult(TryCast(1, System.Object)) PrintResult(TryCast(3.5R, System.ValueType)) PrintResult(TryCast(CObj("sdf"), System.String)) PrintResult(TryCast(New Object(), System.String)) Dim guid As Guid = New Guid("8c5dffd5-1778-4dd3-a9f5-6a9708146a7c") Dim guidObject As Object = guid PrintResult(TryCast(guid, System.Object)) PrintResult(TryCast("abc", System.IComparable)) PrintResult(TryCast(guid, System.IComparable)) PrintResult(GenericParamTestHelperOfString2.NothingToT()) PrintResult(GenericParamTestHelperOfString1.TToObject("abcd")) PrintResult(GenericParamTestHelperOfString1.TToObject(Nothing)) PrintResult(GenericParamTestHelperOfGuid1.TToObject(guid)) PrintResult(GenericParamTestHelperOfString1.TToIComparable("abcde")) PrintResult(GenericParamTestHelperOfString1.TToIComparable(Nothing)) PrintResult(GenericParamTestHelperOfGuid1.TToIComparable(guid)) PrintResult(GenericParamTestHelperOfString2.ObjectToT("ObString")) PrintResult(GenericParamTestHelperOfString2.ObjectToT(Nothing)) PrintResult(GenericParamTestHelperOfString2.IComparableToT("abcde")) PrintResult(GenericParamTestHelperOfString2.IComparableToT(Nothing)) End Sub Function NothingToString() As String Return DirectCast(Nothing, System.String) End Function Function StringToString(val As String) As String Return DirectCast(val, System.String) End Function Class GenericParamTestHelper1(Of T) Public Shared Function TToObject(val As T) As Object Return TryCast(val, Object) End Function Public Shared Function TToIComparable(val As T) As IComparable Return TryCast(val, IComparable) End Function End Class Class GenericParamTestHelper2(Of T As Class) Public Shared Function ObjectToT(val As Object) As T Return TryCast(val, T) End Function Public Shared Function IComparableToT(val As IComparable) As T Return TryCast(val, T) End Function Public Shared Function NothingToT() As T Return TryCast(Nothing, T) End Function End Class Class GenericParamTestHelperOfString1 Inherits GenericParamTestHelper1(Of String) End Class Class GenericParamTestHelperOfString2 Inherits GenericParamTestHelper2(Of String) End Class Class GenericParamTestHelperOfGuid1 Inherits GenericParamTestHelper1(Of Guid) End Class End Module </file> </compilation> CompileAndVerify(compilationDef, expectedOutput:=<![CDATA[ Object: [] String: [] ValueType: [] Object: [1] ValueType: [3.5] String: [sdf] String: [] Object: [8c5dffd5-1778-4dd3-a9f5-6a9708146a7c] IComparable: [abc] IComparable: [8c5dffd5-1778-4dd3-a9f5-6a9708146a7c] String: [] Object: [abcd] Object: [] Object: [8c5dffd5-1778-4dd3-a9f5-6a9708146a7c] IComparable: [abcde] IComparable: [] IComparable: [8c5dffd5-1778-4dd3-a9f5-6a9708146a7c] String: [ObString] String: [] String: [abcde] String: [] ]]>). VerifyIL("Module1.NothingToString", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldnull IL_0001: ret } ]]>). VerifyIL("Module1.StringToString", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldarg.0 IL_0001: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper2(Of T).ObjectToT", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: isinst "T" IL_0006: unbox.any "T" IL_000b: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper1(Of T).TToObject", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: box "T" IL_0006: isinst "Object" IL_000b: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper1(Of T).TToIComparable", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: box "T" IL_0006: isinst "System.IComparable" IL_000b: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper2(Of T).IComparableToT", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: isinst "T" IL_0006: unbox.any "T" IL_000b: ret } ]]>). VerifyIL("Module1.GenericParamTestHelper2(Of T).NothingToT", <![CDATA[ { // Code size 10 (0xa) .maxstack 1 .locals init (T V_0) IL_0000: ldloca.s V_0 IL_0002: initobj "T" IL_0008: ldloc.0 IL_0009: ret } ]]>) End Sub <Fact()> Public Sub Bug4281_1() Dim compilationDef = <compilation name="Bug4281_1"> <file name="a.vb"> Imports System Module M Sub Main() Dim x As Object= DirectCast(1, DayOfWeek) System.Console.WriteLine(x.GetType()) System.Console.WriteLine(x) Dim y As Integer = 2 x = DirectCast(y, DayOfWeek) System.Console.WriteLine(x.GetType()) System.Console.WriteLine(x) End Sub End Module </file> </compilation> CompileAndVerify(compilationDef, expectedOutput:=<![CDATA[ System.DayOfWeek Monday System.DayOfWeek Tuesday ]]>). VerifyIL("M.Main", <![CDATA[ { // Code size 55 (0x37) .maxstack 2 IL_0000: ldc.i4.1 IL_0001: box "System.DayOfWeek" IL_0006: dup IL_0007: callvirt "Function Object.GetType() As System.Type" IL_000c: call "Sub System.Console.WriteLine(Object)" IL_0011: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0016: call "Sub System.Console.WriteLine(Object)" IL_001b: ldc.i4.2 IL_001c: box "System.DayOfWeek" IL_0021: dup IL_0022: callvirt "Function Object.GetType() As System.Type" IL_0027: call "Sub System.Console.WriteLine(Object)" IL_002c: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0031: call "Sub System.Console.WriteLine(Object)" IL_0036: ret } ]]>) End Sub <Fact()> Public Sub Bug4281_2() Dim compilationDef = <compilation name="Bug4281_2"> <file name="a.vb"> Imports System Module M Sub Main() Dim x As DayOfWeek= DirectCast(1, DayOfWeek) System.Console.WriteLine(x.GetType()) System.Console.WriteLine(x) Dim y As Integer = 2 x = DirectCast(y, DayOfWeek) System.Console.WriteLine(x.GetType()) System.Console.WriteLine(x) End Sub End Module </file> </compilation> CompileAndVerify(compilationDef, expectedOutput:=<![CDATA[ System.DayOfWeek 1 System.DayOfWeek 2 ]]>) End Sub <Fact()> Public Sub Bug4256() Dim compilationDef = <compilation name="Bug4256"> <file name="a.vb"> Option Strict On Module M Sub Main() Dim x As Object = 1 Dim y As Long = CLng(x) System.Console.WriteLine(y.GetType()) System.Console.WriteLine(y) End Sub End Module </file> </compilation> CompileAndVerify(compilationDef, expectedOutput:=<![CDATA[ System.Int64 1 ]]>) End Sub <WorkItem(11515, "DevDiv_Projects/Roslyn")> <Fact()> Public Sub TestIdentityConversionForGenericNested() Dim vbCompilation = CreateVisualBasicCompilation("TestIdentityConversionForGenericNested", <![CDATA[Option Strict On Imports System Public Module Program Class C1(Of T) Public EnumField As E1 Structure S1 Public EnumField As E1 End Structure Enum E1 A End Enum End Class Sub Main() Dim outer As New C1(Of Integer) Dim inner As New C1(Of Integer).S1 outer.EnumField = C1(Of Integer).E1.A inner.EnumField = C1(Of Integer).E1.A Goo(inner.EnumField) End Sub Sub Goo(x As Object) Console.WriteLine(x.ToString) End Sub End Module]]>, compilationOptions:=New VisualBasicCompilationOptions(OutputKind.ConsoleApplication)) CompileAndVerify(vbCompilation, expectedOutput:="A").VerifyDiagnostics() End Sub <WorkItem(544919, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544919")> <Fact> Public Sub TestClassifyConversion() Dim source = <text> Imports System Module Program Sub M() End Sub Sub M(l As Long) End Sub Sub M(s As Short) End Sub Sub M(i As Integer) End Sub Sub Main() Dim ii As Integer = 0 Console.WriteLine(ii) Dim jj As Short = 1 Console.WriteLine(jj) Dim ss As String = String.Empty Console.WriteLine(ss) ' Perform conversion classification here. End Sub End Module </text>.Value Dim tree = Parse(source) Dim c As VisualBasicCompilation = VisualBasicCompilation.Create("MyCompilation").AddReferences(MscorlibRef).AddSyntaxTrees(tree) Dim model = c.GetSemanticModel(tree) ' Get VariableDeclaratorSyntax corresponding to variable 'ii' above. Dim variableDeclarator = CType(tree.GetCompilationUnitRoot().FindToken(source.IndexOf("ii", StringComparison.Ordinal)).Parent.Parent, VariableDeclaratorSyntax) ' Get TypeSymbol corresponding to above VariableDeclaratorSyntax. Dim targetType As TypeSymbol = CType(model.GetDeclaredSymbol(variableDeclarator.Names.Single), LocalSymbol).Type Dim local As LocalSymbol = CType(model.GetDeclaredSymbol(variableDeclarator.Names.Single), LocalSymbol) Assert.Equal(1, local.Locations.Length) ' Perform ClassifyConversion for expressions from within the above SyntaxTree. Dim sourceExpression1 = CType(tree.GetCompilationUnitRoot().FindToken(source.IndexOf("jj)", StringComparison.Ordinal)).Parent, ExpressionSyntax) Dim conversion As Conversion = model.ClassifyConversion(sourceExpression1, targetType) Assert.True(conversion.IsWidening) Assert.True(conversion.IsNumeric) Dim sourceExpression2 = CType(tree.GetCompilationUnitRoot().FindToken(source.IndexOf("ss)", StringComparison.Ordinal)).Parent, ExpressionSyntax) conversion = model.ClassifyConversion(sourceExpression2, targetType) Assert.True(conversion.IsNarrowing) Assert.True(conversion.IsString) ' Perform ClassifyConversion for constructed expressions ' at the position identified by the comment "' Perform ..." above. Dim sourceExpression3 As ExpressionSyntax = SyntaxFactory.IdentifierName("jj") Dim position = source.IndexOf("' ", StringComparison.Ordinal) conversion = model.ClassifyConversion(position, sourceExpression3, targetType) Assert.True(conversion.IsWidening) Assert.True(conversion.IsNumeric) Dim sourceExpression4 As ExpressionSyntax = SyntaxFactory.IdentifierName("ss") conversion = model.ClassifyConversion(position, sourceExpression4, targetType) Assert.True(conversion.IsNarrowing) Assert.True(conversion.IsString) Dim sourceExpression5 As ExpressionSyntax = SyntaxFactory.ParseExpression("100L") conversion = model.ClassifyConversion(position, sourceExpression5, targetType) ' This is Widening because the numeric literal constant 100L can be converted to Integer ' without any data loss. Note: This is special for literal constants. Assert.True(conversion.IsWidening) Assert.True(conversion.IsNumeric) End Sub <WorkItem(15925, "DevDiv_Projects/Roslyn")> <WorkItem(544919, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544919")> <Fact> Public Sub TestClassifyConversionStaticLocal() Dim source = <text> Imports System Module Program Sub M() End Sub Sub M(l As Long) End Sub Sub M(s As Short) End Sub Sub M(i As Integer) End Sub Sub Main() Static ii As Integer = 0 Console.WriteLine(ii) Static jj As Short = 1 Console.WriteLine(jj) Static ss As String = String.Empty Console.WriteLine(ss) ' Perform conversion classification here. End Sub End Module </text>.Value Dim tree = Parse(source) Dim c As VisualBasicCompilation = VisualBasicCompilation.Create("MyCompilation").AddReferences(MscorlibRef).AddSyntaxTrees(tree) Dim model = c.GetSemanticModel(tree) ' Get VariableDeclaratorSyntax corresponding to variable 'ii' above. Dim variableDeclarator = CType(tree.GetCompilationUnitRoot().FindToken(source.IndexOf("ii", StringComparison.Ordinal)).Parent.Parent, VariableDeclaratorSyntax) ' Get TypeSymbol corresponding to above VariableDeclaratorSyntax. Dim targetType As TypeSymbol = CType(model.GetDeclaredSymbol(variableDeclarator.Names.Single), LocalSymbol).Type Dim local As LocalSymbol = CType(model.GetDeclaredSymbol(variableDeclarator.Names.Single), LocalSymbol) Assert.Equal(1, local.Locations.Length) ' Perform ClassifyConversion for expressions from within the above SyntaxTree. Dim sourceExpression1 = CType(tree.GetCompilationUnitRoot().FindToken(source.IndexOf("jj)", StringComparison.Ordinal)).Parent, ExpressionSyntax) Dim conversion As Conversion = model.ClassifyConversion(sourceExpression1, targetType) Assert.True(conversion.IsWidening) Assert.True(conversion.IsNumeric) Dim sourceExpression2 = CType(tree.GetCompilationUnitRoot().FindToken(source.IndexOf("ss)", StringComparison.Ordinal)).Parent, ExpressionSyntax) conversion = model.ClassifyConversion(sourceExpression2, targetType) Assert.True(conversion.IsNarrowing) Assert.True(conversion.IsString) ' Perform ClassifyConversion for constructed expressions ' at the position identified by the comment "' Perform ..." above. Dim sourceExpression3 As ExpressionSyntax = SyntaxFactory.IdentifierName("jj") Dim position = source.IndexOf("' ", StringComparison.Ordinal) conversion = model.ClassifyConversion(position, sourceExpression3, targetType) Assert.True(conversion.IsWidening) Assert.True(conversion.IsNumeric) Dim sourceExpression4 As ExpressionSyntax = SyntaxFactory.IdentifierName("ss") conversion = model.ClassifyConversion(position, sourceExpression4, targetType) Assert.True(conversion.IsNarrowing) Assert.True(conversion.IsString) Dim sourceExpression5 As ExpressionSyntax = SyntaxFactory.ParseExpression("100L") conversion = model.ClassifyConversion(position, sourceExpression5, targetType) ' This is Widening because the numeric literal constant 100L can be converted to Integer ' without any data loss. Note: This is special for literal constants. Assert.True(conversion.IsWidening) Assert.True(conversion.IsNumeric) End Sub <WorkItem(544620, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544620")> <Fact()> Public Sub Bug13088() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Public Const Z1 As Integer = 300 Public Const Z2 As Byte = Z1 Public Const Z3 As Byte = CByte(300) Public Const Z4 As Byte = DirectCast(300, Byte) Sub Main() End Sub End Module ]]></file> </compilation>) VerifyDiagnostics(compilation, Diagnostic(ERRID.ERR_ExpressionOverflow1, "Z1").WithArguments("Byte"), Diagnostic(ERRID.ERR_ExpressionOverflow1, "300").WithArguments("Byte"), Diagnostic(ERRID.ERR_TypeMismatch2, "300").WithArguments("Integer", "Byte")) Dim symbol = compilation.GlobalNamespace.GetTypeMembers("Program").Single.GetMembers("Z2").Single Assert.False(DirectCast(symbol, FieldSymbol).HasConstantValue) symbol = compilation.GlobalNamespace.GetTypeMembers("Program").Single.GetMembers("Z3").Single Assert.False(DirectCast(symbol, FieldSymbol).HasConstantValue) symbol = compilation.GlobalNamespace.GetTypeMembers("Program").Single.GetMembers("Z4").Single Assert.False(DirectCast(symbol, FieldSymbol).HasConstantValue) End Sub <WorkItem(545760, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545760")> <Fact()> Public Sub Bug14409() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Option Strict On Module M1 Sub Main() Dim x As System.DayOfWeek? = 0 Test(0) End Sub Sub Test(x As System.DayOfWeek?) End Sub End Module ]]></file> </compilation>, TestOptions.ReleaseExe) CompileAndVerify(compilation) End Sub <WorkItem(545760, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545760")> <Fact()> Public Sub Bug14409_2() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Option Strict On Module M1 Sub Main() Test(0) End Sub Sub Test(x As System.DayOfWeek?) End Sub Sub Test(x As System.TypeCode?) End Sub End Module ]]></file> </compilation>, TestOptions.ReleaseExe) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30519: Overload resolution failed because no accessible 'Test' can be called without a narrowing conversion: 'Public Sub Test(x As DayOfWeek?)': Argument matching parameter 'x' narrows from 'Integer' to 'DayOfWeek?'. 'Public Sub Test(x As TypeCode?)': Argument matching parameter 'x' narrows from 'Integer' to 'TypeCode?'. Test(0) ~~~~ </expected>) End Sub <WorkItem(571095, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/571095")> <Fact()> Public Sub Bug571095_01() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ imports System Module Module1 Sub Main() Dim Y(10, 10) As Integer 'COMPILEERROR: BC30311, "Y" For Each x As string() In Y Console.WriteLine(x) Next x 'COMPILEERROR: BC30311, "Y" For Each x As Integer(,) In Y Console.WriteLine(x) Next x End Sub End Module ]]></file> </compilation>, TestOptions.ReleaseExe) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30311: Value of type 'Integer' cannot be converted to 'String()'. For Each x As string() In Y ~ BC30311: Value of type 'Integer' cannot be converted to 'Integer(*,*)'. For Each x As Integer(,) In Y ~ </expected>) End Sub <WorkItem(571095, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/571095")> <Fact()> Public Sub Bug571095_02() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ imports System Module Module1 Sub Main() Dim Y(10) As Integer 'COMPILEERROR: BC30311, "Y" For Each x As string() In Y Console.WriteLine(x) Next x 'COMPILEERROR: BC30311, "Y" For Each x As Integer() In Y Console.WriteLine(x) Next x End Sub End Module ]]></file> </compilation>, TestOptions.ReleaseExe) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30311: Value of type 'Integer' cannot be converted to 'String()'. For Each x As string() In Y ~ BC30311: Value of type 'Integer' cannot be converted to 'Integer()'. For Each x As Integer() In Y ~ </expected>) End Sub <WorkItem(31, "https://roslyn.codeplex.com/workitem/31")> <Fact()> Public Sub BugCodePlex_31() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Option Strict On Module Module1 Property Value As BooleanEx? Sub Main() If Value Then End If System.Console.WriteLine("---") Value = true System.Console.WriteLine("---") Dim x as Boolean? = Value System.Console.WriteLine("---") If Value Then End If End Sub End Module Structure BooleanEx Private b As Boolean Public Sub New(value As Boolean) b = value End Sub Public Shared Widening Operator CType(value As Boolean) As BooleanEx System.Console.WriteLine("CType(value As Boolean) As BooleanEx") Return New BooleanEx(value) End Operator Public Shared Widening Operator CType(value As BooleanEx) As Boolean System.Console.WriteLine("CType(value As BooleanEx) As Boolean") Return value.b End Operator Public Shared Widening Operator CType(value As Integer) As BooleanEx System.Console.WriteLine("CType(value As Integer) As BooleanEx") Return New BooleanEx(CBool(value)) End Operator Public Shared Widening Operator CType(value As BooleanEx) As Integer System.Console.WriteLine("CType(value As BooleanEx) As Integer") Return CInt(value.b) End Operator Public Shared Widening Operator CType(value As String) As BooleanEx System.Console.WriteLine("CType(value As String) As BooleanEx") Return New BooleanEx(CBool(value)) End Operator Public Shared Widening Operator CType(value As BooleanEx) As String System.Console.WriteLine("CType(value As BooleanEx) As String") Return CStr(value.b) End Operator Public Shared Operator =(value1 As BooleanEx, value2 As Boolean) As Boolean System.Console.WriteLine("=(value1 As BooleanEx, value2 As Boolean) As Boolean") Return False End Operator Public Shared Operator <>(value1 As BooleanEx, value2 As Boolean) As Boolean System.Console.WriteLine("<>(value1 As BooleanEx, value2 As Boolean) As Boolean") Return False End Operator End Structure ]]></file> </compilation>, TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:= "--- CType(value As Boolean) As BooleanEx --- CType(value As BooleanEx) As Boolean --- CType(value As BooleanEx) As Boolean") End Sub <WorkItem(1099862, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1099862")> <Fact()> Public Sub Bug1099862_01() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Sub Main(args As String()) Dim x As Integer = Double.MaxValue End Sub End Module ]]></file> </compilation>) Dim expectedErr = <expected> BC30439: Constant expression not representable in type 'Integer'. Dim x As Integer = Double.MaxValue ~~~~~~~~~~~~~~~ </expected> compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(False)) AssertTheseDiagnostics(compilation, expectedErr) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(False)) AssertTheseDiagnostics(compilation, expectedErr) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(False)) AssertTheseDiagnostics(compilation, expectedErr) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedErr) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedErr) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedErr) End Sub <WorkItem(1099862, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1099862")> <Fact()> Public Sub Bug1099862_02() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Sub Main(args As String()) Dim x As Integer? = Double.MaxValue End Sub End Module ]]></file> </compilation>) Dim expectedError = <expected> BC30439: Constant expression not representable in type 'Integer?'. Dim x As Integer? = Double.MaxValue ~~~~~~~~~~~~~~~ </expected> compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(False)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(False)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(False)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) End Sub <WorkItem(1099862, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1099862")> <Fact()> Public Sub Bug1099862_03() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Sub Main(args As String()) Dim x As Short = Integer.MaxValue System.Console.WriteLine(x) End Sub End Module ]]></file> </compilation>) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="-1").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="-1").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="-1").VerifyDiagnostics() Dim expectedError = <expected> BC30439: Constant expression not representable in type 'Short'. Dim x As Short = Integer.MaxValue ~~~~~~~~~~~~~~~~ </expected> compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) End Sub <WorkItem(1099862, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1099862")> <Fact()> Public Sub Bug1099862_04() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Sub Main(args As String()) Dim x As Short? = Integer.MaxValue System.Console.WriteLine(x) End Sub End Module ]]></file> </compilation>) Dim expectedIL = <![CDATA[ { // Code size 22 (0x16) .maxstack 2 .locals init (Short? V_0) //x IL_0000: nop IL_0001: ldloca.s V_0 IL_0003: ldc.i4.m1 IL_0004: call "Sub Short?..ctor(Short)" IL_0009: ldloc.0 IL_000a: box "Short?" IL_000f: call "Sub System.Console.WriteLine(Object)" IL_0014: nop IL_0015: ret } ]]> compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(False)) Dim verifier = CompileAndVerify(compilation, expectedOutput:="-1").VerifyDiagnostics() verifier.VerifyIL("Program.Main", expectedIL) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(False)) verifier = CompileAndVerify(compilation, expectedOutput:="-1").VerifyDiagnostics() verifier.VerifyIL("Program.Main", expectedIL) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(False)) verifier = CompileAndVerify(compilation, expectedOutput:="-1").VerifyDiagnostics() verifier.VerifyIL("Program.Main", expectedIL) Dim expectedError = <expected> BC30439: Constant expression not representable in type 'Short?'. Dim x As Short? = Integer.MaxValue ~~~~~~~~~~~~~~~~ </expected> compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(True)) AssertTheseDiagnostics(compilation, expectedError) End Sub <WorkItem(1099862, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1099862")> <Fact()> Public Sub Bug1099862_05() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Sub Main(args As String()) Dim x As Short = CInt(Short.MaxValue) System.Console.WriteLine(x) End Sub End Module ]]></file> </compilation>) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(True)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(True)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(True)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() End Sub <WorkItem(1099862, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1099862")> <Fact()> Public Sub Bug1099862_06() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Sub Main(args As String()) Dim x As Short? = CInt(Short.MaxValue) System.Console.WriteLine(x) End Sub End Module ]]></file> </compilation>) compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(False)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(True)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Custom).WithOverflowChecks(True)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.On).WithOverflowChecks(True)) CompileAndVerify(compilation, expectedOutput:="32767").VerifyDiagnostics() End Sub <WorkItem(1099862, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1099862")> <Fact()> Public Sub Bug1099862_07() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Sub Main(args As String()) Dim x = CType(Double.MaxValue, System.Nullable(Of Integer)) End Sub End Module ]]></file> </compilation>) Dim expectedError = <expected> BC30439: Constant expression not representable in type 'Integer?'. Dim x = CType(Double.MaxValue, System.Nullable(Of Integer)) ~~~~~~~~~~~~~~~ </expected> compilation = compilation.WithOptions(TestOptions.DebugExe.WithOptionStrict(OptionStrict.Off).WithOverflowChecks(False)) AssertTheseDiagnostics(compilation, expectedError) End Sub <WorkItem(2094, "https://github.com/dotnet/roslyn/issues/2094")> <Fact()> Public Sub DirectCastNothingToAStructure() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Class Program Shared Sub Main() Try Dim val = DirectCast(Nothing, S) System.Console.WriteLine("Unexpected - 1 !!!") Catch e as System.NullReferenceException System.Console.WriteLine("Expected - 1") End Try Try M(DirectCast(Nothing, S)) System.Console.WriteLine("Unexpected - 2 !!!") Catch e as System.NullReferenceException System.Console.WriteLine("Expected - 2") End Try End Sub Shared Sub M(val as S) End Sub End Class Structure S End Structure ]]></file> </compilation>, options:=TestOptions.ReleaseExe) Dim expectedOutput = <![CDATA[ Expected - 1 Expected - 2 ]]> CompileAndVerify(compilation, expectedOutput:=expectedOutput).VerifyDiagnostics() compilation = compilation.WithOptions(TestOptions.DebugExe) CompileAndVerify(compilation, expectedOutput:=expectedOutput).VerifyDiagnostics() End Sub <WorkItem(8475, "https://github.com/dotnet/roslyn/issues/8475")> <Fact()> Public Sub ConvertConstantBeforeItsDeclaration() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Class Program Shared Sub Main() Dim x as Integer = STR Const STR As String = "" End Sub End Class ]]></file> </compilation>, options:=TestOptions.ReleaseExe) compilation.AssertTheseDiagnostics( <expected> BC32000: Local variable 'STR' cannot be referred to before it is declared. Dim x as Integer = STR ~~~ </expected>) End Sub <WorkItem(9887, "https://github.com/dotnet/roslyn/issues/9887")> <Fact()> Public Sub ConvertReferenceTypeToIntrinsicValueType() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Imports System Module Module1 Sub Main() Dim value As System.IComparable = 1.0R TestBoolean(value) TestByte(value) TestSByte(value) TestShort(value) TestUShort(value) TestInt(value) TestUInt(value) TestLng(value) TestULng(value) TestDec(value) Dim value2 As System.IComparable = 1 TestSng(value2) TestDbl(value) Dim value3 As System.IComparable = "2016-5-23" TestDate(value3) TestChar(value3) End Sub Private Sub TestArray(value2 As System.Collections.IEnumerable) System.Console.WriteLine(CType(value2, Integer())) End Sub Private Sub TestString(value2 As IComparable) System.Console.WriteLine(CStr(value2)) End Sub Private Sub TestChar(value3 As IComparable) System.Console.WriteLine(CChar(value3)) End Sub Private Sub TestDate(value3 As IComparable) System.Console.WriteLine(CDate(value3).Day) End Sub Private Sub TestDbl(value As IComparable) System.Console.WriteLine(CDbl(value)) End Sub Private Sub TestSng(value2 As IComparable) System.Console.WriteLine(CSng(value2)) End Sub Private Sub TestDec(value As IComparable) System.Console.WriteLine(CDec(value)) End Sub Private Sub TestULng(value As IComparable) System.Console.WriteLine(CULng(value)) End Sub Private Sub TestLng(value As IComparable) System.Console.WriteLine(CLng(value)) End Sub Private Sub TestUInt(value As IComparable) System.Console.WriteLine(CUInt(value)) End Sub Private Sub TestInt(value As IComparable) System.Console.WriteLine(CInt(value)) End Sub Private Sub TestUShort(value As IComparable) System.Console.WriteLine(CUShort(value)) End Sub Private Sub TestShort(value As IComparable) System.Console.WriteLine(CShort(value)) End Sub Private Sub TestSByte(value As IComparable) System.Console.WriteLine(CSByte(value)) End Sub Private Sub TestByte(value As IComparable) System.Console.WriteLine(CByte(value)) End Sub Private Sub TestBoolean(value As IComparable) System.Console.WriteLine(CBool(value)) End Sub Sub TestTypeParameter(Of T)(value As IComparable) System.Console.WriteLine(CType(value, T)) End Sub End Module ]]></file> </compilation>, options:=TestOptions.ReleaseExe) Dim verifier = CompileAndVerify(compilation, expectedOutput:= "True 1 1 1 1 1 1 1 1 1 1 1 23 2") verifier.VerifyIL("Module1.TestArray", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: castclass "Integer()" IL_0006: call "Sub System.Console.WriteLine(Object)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestString", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: castclass "String" IL_0006: call "Sub System.Console.WriteLine(String)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestChar", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToChar(Object) As Char" IL_0006: call "Sub System.Console.WriteLine(Char)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestDate", <![CDATA[ { // Code size 20 (0x14) .maxstack 1 .locals init (Date V_0) IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToDate(Object) As Date" IL_0006: stloc.0 IL_0007: ldloca.s V_0 IL_0009: call "Function Date.get_Day() As Integer" IL_000e: call "Sub System.Console.WriteLine(Integer)" IL_0013: ret } ]]>) verifier.VerifyIL("Module1.TestDbl", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(Object) As Double" IL_0006: call "Sub System.Console.WriteLine(Double)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestSng", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToSingle(Object) As Single" IL_0006: call "Sub System.Console.WriteLine(Single)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestDec", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(Object) As Decimal" IL_0006: call "Sub System.Console.WriteLine(Decimal)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestULng", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToULong(Object) As ULong" IL_0006: call "Sub System.Console.WriteLine(ULong)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestLng", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToLong(Object) As Long" IL_0006: call "Sub System.Console.WriteLine(Long)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestUInt", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToUInteger(Object) As UInteger" IL_0006: call "Sub System.Console.WriteLine(UInteger)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestInt", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object) As Integer" IL_0006: call "Sub System.Console.WriteLine(Integer)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestUShort", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToUShort(Object) As UShort" IL_0006: call "Sub System.Console.WriteLine(Integer)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestShort", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToShort(Object) As Short" IL_0006: call "Sub System.Console.WriteLine(Integer)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestSByte", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToSByte(Object) As SByte" IL_0006: call "Sub System.Console.WriteLine(Integer)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestByte", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToByte(Object) As Byte" IL_0006: call "Sub System.Console.WriteLine(Integer)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestBoolean", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.0 IL_0001: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean(Object) As Boolean" IL_0006: call "Sub System.Console.WriteLine(Boolean)" IL_000b: ret } ]]>) verifier.VerifyIL("Module1.TestTypeParameter", <![CDATA[ { // Code size 17 (0x11) .maxstack 1 IL_0000: ldarg.0 IL_0001: unbox.any "T" IL_0006: box "T" IL_000b: call "Sub System.Console.WriteLine(Object)" IL_0010: ret } ]]>) End Sub <WorkItem(73032, "https://github.com/dotnet/roslyn/issues/73032")> <Fact()> Public Sub ConvertLargeDoubleConstantsAndLiteralsToLong() Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime( <compilation> <file name="a.vb"><![CDATA[ Module Program Sub Main() System.Console.WriteLine(CType(CDbl(&H8000000000000000L), Long) = ConvertToLong(CDbl(&H8000000000000000L))) System.Console.WriteLine(CType(CDbl(&H8000000000000400L), Long) = ConvertToLong(CDbl(&H8000000000000400L))) System.Console.WriteLine(CType(-9.0E+18, Long) = ConvertToLong(-9.0E+18)) System.Console.WriteLine(CType(CDbl(&H8FFFFFFFFFFFFC00L), Long) = ConvertToLong(CDbl(&H8FFFFFFFFFFFFC00L))) System.Console.WriteLine(CType(CDbl(&H9000000000000000L), Long) = ConvertToLong(CDbl(&H9000000000000000L))) System.Console.WriteLine(CType(CDbl(&H7000000000000000L), Long) = ConvertToLong(CDbl(&H7000000000000000L))) System.Console.WriteLine(CType(CDbl(&H7000000000000400L), Long) = ConvertToLong(CDbl(&H7000000000000400L))) System.Console.WriteLine(CType(9.0E+18, Long) = ConvertToLong(9.0E+18)) System.Console.WriteLine(CType(CDbl(&H7FFFFFFFFFFFFC00L), Long) = ConvertToLong(CDbl(&H7FFFFFFFFFFFFC00L))) End Sub Function ConvertToLong(x as Double) As Long Return CType(x, Long) End Function End Module ]]></file> </compilation>, options:=TestOptions.ReleaseExe.WithOverflowChecks(True)) Dim expectedOutput = <![CDATA[ True True True True True True True True True ]]> CompileAndVerify(compilation, expectedOutput:=expectedOutput).VerifyDiagnostics() End Sub <Fact(), WorkItem("https://github.com/dotnet/roslyn/issues/36377")> Public Sub GetSymbolInfo_ExplicitCastOnMethodGroup() Dim compilation = CreateCompilation( <compilation> <file name="a.vb"><![CDATA[ Public Class C Public Shared Sub M() Dim x As C = DirectCast(AddressOf C.Test, C) End Sub Public Shared Function Test() As Integer Return 1 End Function Public Shared Widening Operator CType(ByVal intDelegate As System.Func(Of Integer)) As C Return New C() End Operator End Class ]]></file> </compilation>) compilation.AssertTheseEmitDiagnostics(<expected> BC30581: 'AddressOf' expression cannot be converted to 'C' because 'C' is not a delegate type. Dim x As C = DirectCast(AddressOf C.Test, C) ~~~~~~~~~~~~~~~~ </expected>) Dim tree = compilation.SyntaxTrees.Single() Dim model = compilation.GetSemanticModel(tree) Dim syntax = tree.GetRoot().DescendantNodes().OfType(Of UnaryExpressionSyntax)().Single() Assert.Null(model.GetSymbolInfo(syntax).Symbol) Assert.Null(model.GetSymbolInfo(syntax.Operand).Symbol) End Sub End Class End Namespace