⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctypeexpression.vb

📁 大名鼎鼎的mono是.NET平台的跨平台(支持linux
💻 VB
📖 第 1 页 / 共 2 页
字号:
                If Helper.CompareType(Compiler.TypeCache.System_Object, SourceElementType) Then                    Emitter.EmitCastClass(Info, SourceType, DestinationType)                ElseIf Helper.CompareType(SourceElementType, DestinationElementType) OrElse DestinationElementType.IsSubclassOf(SourceElementType) OrElse SourceElementType.IsSubclassOf(DestinationElementType) Then                    Emitter.EmitCastClass(Info, SourceType, DestinationType)                ElseIf Helper.DoesTypeImplementInterface(Compiler, SourceElementType, DestinationElementType) Then                    Emitter.EmitCastClass(Info, SourceType, DestinationType)                ElseIf DestinationElementType.IsInterface AndAlso Helper.CompareType(Compiler.TypeCache.System_Object, SourceElementType) Then                    Emitter.EmitCastClass(Info, SourceType, DestinationType)                ElseIf SourceElementType.IsEnum AndAlso Helper.CompareType(Helper.GetEnumType(Compiler, SourceElementType), DestinationElementType) Then                    'Conversions also exist between an array of an enumerated type and an array of the enumerated type's underlying type of the same rank.                    Emitter.EmitCastClass(Info, SourceType, DestinationType)                ElseIf TypeOf SourceElementType Is TypeParameterDescriptor AndAlso Helper.IsTypeConvertibleToAny(Helper.GetGenericParameterConstraints(SourceElementType), DestinationElementType) Then                    Emitter.EmitCastClass(Info, SourceType, DestinationType)                Else                    Info.Compiler.Report.ShowMessage(Messages.VBNC30311, SourceType.Name, DestinationType.Name)                    result = False                End If            End If        ElseIf SourceType.IsClass Then            If DestinationType.IsGenericParameter Then                Dim method As MethodInfo                method = Compiler.TypeCache.MS_VB_CS_Conversions__ToGenericParameter_Object.MakeGenericMethod(DestinationType.UnderlyingSystemType)                Emitter.EmitCall(Info, Compiler.TypeCache.System_Runtime_CompilerServices_RuntimeHelpers__GetObjectValue_Object)                Emitter.EmitCall(Info, method)            ElseIf DestinationType.IsClass Then                Emitter.EmitCastClass(Info, SourceType, DestinationType)            ElseIf DestinationType.IsInterface Then                Emitter.EmitCastClass(Info, SourceType, DestinationType)            ElseIf DestinationType.IsValueType Then                Emitter.EmitUnbox(Info, DestinationType)                Emitter.EmitLdobj(Info, DestinationType)            ElseIf DestinationType.IsEnum Then                Throw New InternalException(Me) 'This is an elemental conversion already covered.            ElseIf DestinationType.IsArray Then                Throw New InternalException(Me) 'This is an IsClass case.            Else                Throw New InternalException(Me)            End If        ElseIf SourceType.IsValueType Then            'A value type value can be converted to one of its base reference types or an interface type that it implements through a process called boxing            If Helper.CompareType(DestinationType, Compiler.TypeCache.System_Object) Then                Throw New InternalException(Me) 'This is an elemental conversion already covered. 'Emitter.EmitBox(Info)            ElseIf Helper.DoesTypeImplementInterface(Compiler, SourceType, DestinationType) Then                Emitter.EmitBox(Info, SourceType)                Emitter.EmitCastClass(Info, Compiler.TypeCache.System_Object, DestinationType)            ElseIf Helper.CompareType(SourceType.BaseType, DestinationType) Then                Emitter.EmitBox(Info, DestinationType)            Else                Throw New InternalException("Operator CType is not defined for types '" & SourceType.FullName & "' and '" & DestinationType.FullName & "'")            End If        ElseIf SourceType.IsInterface Then            If DestinationType.IsGenericParameter Then                Dim method As MethodInfo                method = Compiler.TypeCache.MS_VB_CS_Conversions__ToGenericParameter_Object.MakeGenericMethod(DestinationType.UnderlyingSystemType)                Emitter.EmitCall(Info, Compiler.TypeCache.System_Runtime_CompilerServices_RuntimeHelpers__GetObjectValue_Object)                Emitter.EmitCall(Info, method)            ElseIf Helper.DoesTypeImplementInterface(Compiler, DestinationType, SourceType) Then                If DestinationType.IsValueType Then                    Emitter.EmitUnbox(Info, DestinationType)                    Emitter.EmitLdobj(Info, DestinationType)                Else                    Emitter.EmitCastClass(Info, SourceType, DestinationType)                End If            ElseIf DestinationType.IsClass OrElse DestinationType.IsInterface Then                Emitter.EmitCastClass(Info, SourceType, DestinationType)            Else                'However, classes that represent COM classes may have interface implementations that are not known until run time. Consequently, a class type may also be converted to an interface type that it does not implement, an interface type may be converted to a class type that does not implement it, and an interface type may be converted to another interface type with which it has no inheritance relationship                Helper.NotImplemented()            End If        Else            Helper.NotImplemented()        End If        Return result    End Function    Protected Overrides Function ResolveExpressionInternal(ByVal Info As ResolveInfo) As Boolean        Dim result As Boolean = True        If m_ResolvedDestinationType Is Nothing Then            result = m_DestinationType.ResolveTypeReferences AndAlso result            m_ResolvedDestinationType = m_DestinationType.ResolvedType        End If        result = MyBase.ResolveExpressionInternal(Info) AndAlso result        Select Case Helper.GetTypeCode(Compiler, Me.ExpressionType)            Case TypeCode.Boolean                result = CBoolExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Byte                result = CByteExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Char                result = CCharExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.DateTime                result = CDateExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Decimal                result = CDecExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Double                result = CDblExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Int16                result = CShortExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Int32                result = CIntExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Int64                result = CLngExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.SByte                result = CSByteExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Single                result = CSngExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.String                result = CStrExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.UInt16                result = CUShortExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.UInt32                result = CUIntExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.UInt64                result = CULngExpression.Validate(Info, Expression.ExpressionType) AndAlso result            Case TypeCode.Object, TypeCode.DBNull                If Helper.CompareType(Me.ExpressionType, Compiler.TypeCache.System_Object) Then                    result = CObjExpression.Validate(Info, Expression.ExpressionType) AndAlso result                ElseIf Helper.CompareType(Me.ExpressionType, Compiler.TypeCache.System_Char_Array) AndAlso Helper.CompareType(Expression.ExpressionType, Compiler.TypeCache.System_String) Then                    If Location.File(Compiler).IsOptionStrictOn Then                        result = Compiler.Report.ShowMessage(Messages.VBNC30512, Location, Expression.ExpressionType.FullName, Me.ExpressionType.FullName)                    Else                        m_IsStringToCharArray = True                    End If                Else                    'Helper.NotImplementedYet("") Anything to do here?                End If            Case Else                Throw New InternalException(Me)        End Select        Return result        Return result    End Function    Overrides ReadOnly Property ExpressionType() As Type        Get            Return m_ResolvedDestinationType        End Get    End Property    Public Overrides ReadOnly Property ConstantValue() As Object        Get            Select Case Helper.GetTypeCode(Compiler, Me.ExpressionType)                Case TypeCode.String                    Select Case Helper.GetTypeCode(Compiler, Me.Expression.ExpressionType)                        Case TypeCode.Char                            Return CStr(Expression.ConstantValue)                        Case Else                            Helper.NotImplemented()                            Throw New InternalException(Me)                    End Select                Case Else                    Helper.NotImplemented()                    Throw New InternalException(Me)            End Select        End Get    End Property    Public Overrides ReadOnly Property IsConstant() As Boolean        Get            If Expression.IsConstant Then                If m_ResolvedDestinationType IsNot Nothing AndAlso Helper.CompareType(m_ResolvedDestinationType, Compiler.TypeCache.System_String) AndAlso Helper.CompareType(Expression.ExpressionType, Compiler.TypeCache.System_Char) Then                    Return True                Else                    Return False                End If            Else                Return False            End If            Return False 'TODO: This isn't true.        End Get    End Property    Protected Overridable ReadOnly Property GetKeyword() As KS        Get            Return KS.CType        End Get    End Property#If DEBUG Then    Public Overrides Sub Dump(ByVal Dumper As IndentedTextWriter)        Dumper.Write(Enums.GetKSStringAttribute(GetKeyword).FriendlyValue)        Dumper.Write("(")        Expression.Dump(Dumper)        Dumper.Write(" ,")        Compiler.Dumper.Dump(m_DestinationType)        Dumper.Write(")")    End Sub#End IfEnd Class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -