in src/Compilers/VisualBasic/Portable/Semantics/Conversions.vb [3075:3332]
) As ConversionKind
Debug.Assert(Not srcElem.IsSameTypeIgnoringAll(dstElem))
Dim srcElemIsValueType As Boolean = srcElem.IsValueType
Dim dstElemIsValueType As Boolean = dstElem.IsValueType
If Not srcElemIsValueType AndAlso Not dstElemIsValueType Then
Dim conv = Classify_Reference_Array_TypeParameterConversion(srcElem, dstElem, varianceCompatibilityClassificationDepth, useSiteDiagnostics)
If IsWideningConversion(conv) Then
Debug.Assert((conv And ConversionKind.VarianceConversionAmbiguity) = 0)
If srcElem.IsReferenceType AndAlso dstElem.IsReferenceType Then
Return ConversionKind.WideningArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
ElseIf srcElem.Kind = SymbolKind.TypeParameter AndAlso
dstElem.Kind = SymbolKind.TypeParameter Then
If srcElem.IsReferenceType Then
Debug.Assert(Not dstElem.IsReferenceType)
Debug.Assert(Not dstElemIsValueType)
Return ConversionKind.WideningArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
ElseIf dstElem.IsReferenceType Then
Return ConversionKind.NarrowingArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
Else
Return ConversionKind.NarrowingArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
End If
ElseIf srcElem.Kind = SymbolKind.TypeParameter OrElse
dstElem.Kind = SymbolKind.TypeParameter Then
Return ConversionKind.NarrowingArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
End If
ElseIf IsNarrowingConversion(conv) Then
Debug.Assert(Not srcElemIsValueType AndAlso Not dstElemIsValueType)
Return ConversionKind.NarrowingArray Or
(conv And (ConversionKind.InvolvesEnumTypeConversions Or ConversionKind.VarianceConversionAmbiguity))
ElseIf (conv And ConversionKind.MightSucceedAtRuntime) <> 0 Then
Return ConversionKind.MightSucceedAtRuntime
End If
Return Nothing
Else
Debug.Assert(srcElemIsValueType OrElse dstElemIsValueType)
If srcElemIsValueType Then
If dstElemIsValueType Then
Dim mightSucceedAtRuntime As ConversionKind = Nothing
If srcElem.Kind = SymbolKind.TypeParameter OrElse
dstElem.Kind = SymbolKind.TypeParameter Then
Dim conv = ClassifyTypeParameterConversion(srcElem, dstElem, varianceCompatibilityClassificationDepth, useSiteDiagnostics)
Debug.Assert((conv And ConversionKind.VarianceConversionAmbiguity) = 0)
If IsWideningConversion(conv) Then
Return ConversionKind.WideningArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
ElseIf IsNarrowingConversion(conv) Then
Return ConversionKind.NarrowingArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
End If
If (conv And ConversionKind.MightSucceedAtRuntime) <> 0 Then
mightSucceedAtRuntime = ConversionKind.MightSucceedAtRuntime
End If
End If
Dim srcValueType As TypeSymbol = srcElem
Dim dstValueType As TypeSymbol = dstElem
If srcElem.Kind = SymbolKind.TypeParameter Then
Dim valueType = GetValueTypeConstraint(srcElem, useSiteDiagnostics)
If valueType IsNot Nothing Then
srcValueType = valueType
End If
End If
If dstElem.Kind = SymbolKind.TypeParameter Then
Dim valueType = GetValueTypeConstraint(dstElem, useSiteDiagnostics)
If valueType IsNot Nothing Then
dstValueType = valueType
End If
End If
Dim srcUnderlying As NamedTypeSymbol = GetNonErrorEnumUnderlyingType(srcValueType)
Dim dstUnderlying As NamedTypeSymbol = GetNonErrorEnumUnderlyingType(dstValueType)
If srcUnderlying IsNot Nothing Then
If IsNumericType(srcUnderlying) Then
If dstUnderlying IsNot Nothing Then
If srcUnderlying.Equals(dstUnderlying) Then
Return ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions
End If
ElseIf srcUnderlying.Equals(dstValueType) Then
If dstElem Is dstValueType Then
Return ConversionKind.WideningArray Or ConversionKind.InvolvesEnumTypeConversions
Else
Return ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions
End If
End If
End If
ElseIf dstUnderlying IsNot Nothing Then
If IsNumericType(dstUnderlying) AndAlso dstUnderlying.Equals(srcValueType) Then
Return ConversionKind.NarrowingArray Or ConversionKind.InvolvesEnumTypeConversions
End If
End If
If mightSucceedAtRuntime = Nothing Then
Dim srcSize As Integer = ArrayElementBitSize(srcValueType)
If srcSize > 0 AndAlso srcSize = ArrayElementBitSize(dstValueType) Then
mightSucceedAtRuntime = ConversionKind.MightSucceedAtRuntime
End If
End If
Return mightSucceedAtRuntime
ElseIf dstElem.Kind = SymbolKind.TypeParameter AndAlso
Not dstElem.IsReferenceType Then
If srcElem.Kind = SymbolKind.TypeParameter Then
Dim conv = ClassifyTypeParameterConversion(srcElem, dstElem, varianceCompatibilityClassificationDepth, useSiteDiagnostics)
If IsWideningConversion(conv) Then
Debug.Assert((conv And ConversionKind.VarianceConversionAmbiguity) = 0)
Return ConversionKind.NarrowingArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
End If
Debug.Assert(NoConversion(conv))
If (conv And ConversionKind.MightSucceedAtRuntime) <> 0 Then
Return ConversionKind.MightSucceedAtRuntime
End If
Return Nothing
ElseIf ArrayElementBitSize(srcElem) > 0 Then
Return ConversionKind.MightSucceedAtRuntime
End If
End If
ElseIf srcElem.Kind = SymbolKind.TypeParameter AndAlso Not srcElem.IsReferenceType Then
Debug.Assert(dstElemIsValueType)
If dstElem.Kind = SymbolKind.TypeParameter Then
Dim conv = ClassifyTypeParameterConversion(srcElem, dstElem, varianceCompatibilityClassificationDepth, useSiteDiagnostics)
If IsNarrowingConversion(conv) Then
Return ConversionKind.NarrowingArray Or (conv And ConversionKind.InvolvesEnumTypeConversions)
End If
Debug.Assert(NoConversion(conv))
If (conv And ConversionKind.MightSucceedAtRuntime) <> 0 Then
Return ConversionKind.MightSucceedAtRuntime
End If
ElseIf ArrayElementBitSize(dstElem) > 0 Then
Return ConversionKind.MightSucceedAtRuntime
End If
End If
Return Nothing
End If
End Function