internal static ConversionClass ClassifyPredefinedConversion(Type TargetType, Type SourceType) { if (TargetType == SourceType) { return(ConversionClass.Identity); } TypeCode typeCode = Symbols.GetTypeCode(SourceType); TypeCode code2 = Symbols.GetTypeCode(TargetType); if (Symbols.IsIntrinsicType(typeCode) && Symbols.IsIntrinsicType(code2)) { if ((Symbols.IsEnum(TargetType) && Symbols.IsIntegralType(typeCode)) && Symbols.IsIntegralType(code2)) { return(ConversionClass.Narrowing); } if ((typeCode == code2) && Symbols.IsEnum(SourceType)) { return(ConversionClass.Widening); } return(ClassifyIntrinsicConversion(code2, typeCode)); } if (Symbols.IsCharArrayRankOne(SourceType) && Symbols.IsStringType(TargetType)) { return(ConversionClass.Widening); } if (Symbols.IsCharArrayRankOne(TargetType) && Symbols.IsStringType(SourceType)) { return(ConversionClass.Narrowing); } return(ClassifyPredefinedCLRConversion(TargetType, SourceType)); }
internal static ConversionClass ClassifyConversion(Type TargetType, Type SourceType, ref Symbols.Method OperatorMethod) { ConversionClass class3 = ClassifyPredefinedConversion(TargetType, SourceType); if ((((class3 != ConversionClass.None) || Symbols.IsInterface(SourceType)) || Symbols.IsInterface(TargetType)) || (!Symbols.IsClassOrValueType(SourceType) && !Symbols.IsClassOrValueType(TargetType))) { return(class3); } if (Symbols.IsIntrinsicType(SourceType) && Symbols.IsIntrinsicType(TargetType)) { return(class3); } return(ClassifyUserDefinedConversion(TargetType, SourceType, ref OperatorMethod)); }
private static List <Symbols.Method> CollectConversionOperators(Type TargetType, Type SourceType, ref bool FoundTargetTypeOperators, ref bool FoundSourceTypeOperators) { if (Symbols.IsIntrinsicType(TargetType)) { TargetType = typeof(object); } if (Symbols.IsIntrinsicType(SourceType)) { SourceType = typeof(object); } List <Symbols.Method> list3 = Operators.CollectOperators(Symbols.UserDefinedOperator.Widen, TargetType, SourceType, ref FoundTargetTypeOperators, ref FoundSourceTypeOperators); List <Symbols.Method> collection = Operators.CollectOperators(Symbols.UserDefinedOperator.Narrow, TargetType, SourceType, ref FoundTargetTypeOperators, ref FoundSourceTypeOperators); list3.AddRange(collection); return(list3); }