) As ConversionKind

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