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)); }
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); } }