📄 ctypeexpression.vb
字号:
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 + -