예제 #1
0
        public static NewArrayExpression NewArrayHelper(Type type, IList <Expression> initializers)
        {
            Contract.RequiresNotNullItems(initializers, "initializers");
            Contract.RequiresNotNull(type, "type");
            Contract.Requires(type.IsArray, "type", "Not an array type");

            Type element = type.GetElementType();

            Expression[] clone = null;
            for (int i = 0; i < initializers.Count; i++)
            {
                Expression initializer = initializers[i];
                if (!TypeUtils.CanAssign(element, initializer.Type))
                {
                    if (clone == null)
                    {
                        clone = new Expression[initializers.Count];
                        for (int j = 0; j < i; j++)
                        {
                            clone[j] = initializers[j];
                        }
                    }
                    initializer = Ast.Convert(initializer, element);
                }
                if (clone != null)
                {
                    clone[i] = initializer;
                }
            }

            return(NewArray(type, clone ?? initializers));
        }
예제 #2
0
        private static void EmitArgument(CodeGen cg, Expression argument, Type type)
        {
            //if (argument.Type != type && (argument.Type.IsValueType || type.IsValueType))
            if (!type.IsAssignableFrom(argument.Type) || (argument.Type != type && (argument.Type.IsValueType || type.IsValueType)))
            {
                argument = Ast.Convert(argument, type);
            }

            if (type.IsByRef)
            {
                argument.EmitAddress(cg, type.GetElementType());
            }
            else
            {
                argument.Emit(cg);
            }
        }