private BoundExpression VisitObjectCreationExpressionInternal(BoundObjectCreationExpression node) { if (node.ConstantValue != null) { // typically a decimal constant. return(Constant(node)); } if ((object)node.Constructor == null || (node.Arguments.Length == 0 && !node.Type.IsStructType()) || node.Constructor.IsDefaultValueTypeConstructor()) { return(ExprFactory("New", _bound.Typeof(node.Type))); } var ctor = _bound.ConstructorInfo(node.Constructor); var args = _bound.Convert(_IEnumerableType.Construct(ExpressionType), Expressions(node.Arguments)); if (node.Type.IsAnonymousType && node.Arguments.Length != 0) { var anonType = (NamedTypeSymbol)node.Type; var membersBuilder = ArrayBuilder <BoundExpression> .GetInstance(); for (int i = 0; i < node.Arguments.Length; i++) { membersBuilder.Add(_bound.MethodInfo(AnonymousTypeManager.GetAnonymousTypeProperty(anonType, i).GetMethod)); } return(ExprFactory("New", ctor, args, _bound.ArrayOrEmpty(MemberInfoType, membersBuilder.ToImmutableAndFree()))); } else { return(ExprFactory("New", ctor, args)); } }