private static Func <Closure, object> Unary(UnaryExpression unaryExpression, ConstantExpression[] constantsExprs, ParameterExpression[] localsExprs) { var valueFn = Expression(unaryExpression.Operand, constantsExprs, localsExprs); var opUnaryNegation = WrapUnaryOperation(unaryExpression.Method) ?? WrapUnaryOperation(unaryExpression.Operand.Type, "op_UnaryNegation"); var opUnaryPlus = WrapUnaryOperation(unaryExpression.Method) ?? WrapUnaryOperation(unaryExpression.Operand.Type, "op_UnaryPlus"); var opOnesComplement = WrapUnaryOperation(unaryExpression.Method) ?? WrapUnaryOperation(unaryExpression.Operand.Type, "op_OnesComplement"); var isNullable = IsNullable(unaryExpression.Operand); return(closure => { var operand = valueFn(closure); if (isNullable && operand == null && unaryExpression.NodeType != ExpressionType.ArrayLength) { return null; } switch (unaryExpression.NodeType) { case ExpressionType.Negate: case ExpressionType.NegateChecked: return Intrinsics.UnaryOperation(closure, operand, unaryExpression.NodeType, opUnaryNegation); case ExpressionType.UnaryPlus: return Intrinsics.UnaryOperation(closure, operand, unaryExpression.NodeType, opUnaryPlus); case ExpressionType.Not: return Intrinsics.UnaryOperation(closure, operand, unaryExpression.NodeType, opOnesComplement); case ExpressionType.ArrayLength: return closure.Unbox <Array>(operand).Length; } throw new InvalidOperationException(string.Format(Properties.Resources.EXCEPTION_COMPIL_UNKNOWNUNARYEXPRTYPE, unaryExpression.Type)); }); }