private static Type GetWidestType(Type Type1, Type Type2) { if ((Type1 != null) && (Type2 != null)) { if (!Type1.IsEnum && !Type2.IsEnum) { TypeCode typeCode = Symbols.GetTypeCode(Type1); TypeCode code2 = Symbols.GetTypeCode(Type2); if (Symbols.IsNumericType(typeCode) && Symbols.IsNumericType(code2)) { return(Symbols.MapTypeCodeToType(ConversionResolution.ForLoopWidestTypeCode[(int)typeCode][(int)code2])); } } Symbols.Method operatorMethod = null; switch (ConversionResolution.ClassifyConversion(Type2, Type1, ref operatorMethod)) { case ConversionResolution.ConversionClass.Identity: case ConversionResolution.ConversionClass.Widening: return(Type2); } operatorMethod = null; if (ConversionResolution.ClassifyConversion(Type1, Type2, ref operatorMethod) == ConversionResolution.ConversionClass.Widening) { return(Type1); } } return(null); }
internal bool Lookup(Type TargetType, Type SourceType, ref ConversionResolution.ConversionClass Classification, ref Symbols.Method OperatorMethod) { int first = this.m_First; for (int i = 0; i < this.m_Count; i++) { if ((TargetType == this.m_List[first].TargetType) && (SourceType == this.m_List[first].SourceType)) { Classification = this.m_List[first].Classification; OperatorMethod = this.m_List[first].OperatorMethod; this.MoveToFront(first); return true; } first = this.m_List[first].Next; } Classification = ConversionResolution.ConversionClass.Bad; OperatorMethod = null; return false; }
internal void Insert(Type TargetType, Type SourceType, ConversionResolution.ConversionClass Classification, Symbols.Method OperatorMethod) { if (this.m_Count < this.m_Size) { this.m_Count++; } int last = this.m_Last; this.m_First = last; this.m_Last = this.m_List[this.m_Last].Previous; this.m_List[last].TargetType = TargetType; this.m_List[last].SourceType = SourceType; this.m_List[last].Classification = Classification; this.m_List[last].OperatorMethod = OperatorMethod; }