public override SyntaxNode VisitArgument(ArgumentSyntax node) { var ti = this.semanticModel.GetTypeInfo(node.Expression); ITypeSymbol type = null; IMethodSymbol method = null; IParameterSymbol parameter = null; if (ti.Type != null && ti.Type.TypeKind == TypeKind.Delegate) { type = ti.Type; } else if (ti.ConvertedType != null && ti.ConvertedType.TypeKind == TypeKind.Delegate) { type = ti.ConvertedType; } if (type != null) { var list = node.Parent as ArgumentListSyntax; var invocation = node.Parent.Parent as InvocationExpressionSyntax; if (list != null && invocation != null) { method = this.semanticModel.GetSymbolInfo(invocation).Symbol as IMethodSymbol; if (method != null) { if (node.NameColon != null) { if (node.NameColon.Name != null) { var nameText = node.NameColon.Name.Identifier.ValueText; if (nameText != null) { foreach (var p in method.Parameters) { if (string.Equals(p.Name, nameText, StringComparison.Ordinal)) { parameter = p; break; } } } } } else { var index = list.Arguments.IndexOf(node); if (index >= 0) { if (index < method.Parameters.Length) { parameter = method.Parameters[index]; } else if (index >= method.Parameters.Length && method.Parameters[method.Parameters.Length - 1].IsParams) { parameter = method.Parameters[method.Parameters.Length - 1]; } } } } } } var isParam = parameter != null && !SyntaxHelper.IsAnonymous(parameter.Type); var parent = isParam && parameter.IsParams ? (InvocationExpressionSyntax)node.Parent.Parent : null; node = (ArgumentSyntax)base.VisitArgument(node); if (isParam) { var pType = parameter.Type; if (parameter.IsParams && SharpSixRewriter.IsExpandedForm(this.semanticModel, parent, method)) { pType = ((IArrayTypeSymbol)parameter.Type).ElementType; } if (node.Expression is CastExpressionSyntax && type.Equals(pType) || parameter.RefKind != RefKind.None) { return(node); } if (pType.TypeKind == TypeKind.Delegate || parameter.IsParams && ((IArrayTypeSymbol)parameter.Type).ElementType.TypeKind == TypeKind.Delegate) { var name = SyntaxFactory.IdentifierName(pType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)).WithoutTrivia(); var expr = node.Expression; if (expr is LambdaExpressionSyntax || expr is AnonymousMethodExpressionSyntax) { expr = SyntaxFactory.ParenthesizedExpression(expr); } var cast = SyntaxFactory.CastExpression(name, expr); node = node.WithExpression(cast); } } return(node); }