Пример #1
0
        public static bool SetType(ref Expression expr, IType dstType, IContext context)
        {
            IType type = expr.EvalType;

            if (!type.CanAssignTo(dstType))
            {
                if (type.CanPromoteTo(dstType))
                {
                    expr = new TypePromotionExpression(expr, new ResolvedType(dstType));
                    expr = expr.ResolveRValue(context);
                }

                /*
                 * else if (type.CanImplicitlyCastTo(dstType))
                 * {
                 * }
                 */
                else if ((dstType.IsEqualTo(Types.GetType("Object")) || dstType.IsEqualTo(Types.GetType("ValueType"))) && (type is ValueTypeSymbol))
                {
                    expr = new BoxExpression(expr);
                    expr = expr.ResolveRValue(context);
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }
 public override bool CanCastTo(IType targetType)
 {
     if (targetType.CanPromoteTo(this) || CanPromoteTo(targetType))
     {
         return(true);
     }
     else if (IsInstanceOf(targetType))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Пример #3
0
        public static bool IsConvertible(IType type, IType dstType)
        {
            if (!type.CanAssignTo(dstType))
            {
                if (type.CanPromoteTo(dstType))
                {
                    return(true);
                }

                /*
                 * else if (type.CanImplicitlyCastTo(dstType))
                 *  return true;
                 */
                else if ((dstType.IsEqualTo(Types.GetType("Object")) || dstType.IsEqualTo(Types.GetType("ValueType"))) && (type is ValueTypeSymbol))
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }