if you look at the source code of InvocationExpression
public sealed class InvocationExpression : Expression, IArgumentProvider
{
public Expression Expression { get; }
public ReadOnlyCollection<Expression> Arguments { get; }
}
why it is not public ReadOnlyCollection<ParameterExpression> Arguments { get; }
, just like what LambdaExpression
is, isn't that the Arguments
in InvocationExpression
the same thing as Parameters
in LambdaExpression
?
public abstract class LambdaExpression : Expression
{
public Expression Body { get; }
public ReadOnlyCollection<ParameterExpression> Parameters { get; }
// ...
}
CodePudding user response:
Parameters and arguments aren't the same thing. A parameter is part of the declaration of a method, constructor, lambda expression etc. An argument is an expression evaluated to obtain the initial value of a parameter - and it can generally be any expression that's convertible to the appropriate type. If the Arguments
property were of type ReadOnlyCollection<ParameterExpression>
, you'd only be able to use parameters as invocation arguments... so you would be able to create an expression tree like this:
Expression<Action<string>> x = p => Console.WriteLine(p);
(because the expression p
is a parameter expression)... but you wouldn't be able to write this:
Expression<Action<string>> x = p => Console.WriteLine("Hello " p);
... because "Hello " p
(the argument to Console.WriteLine
) isn't a parameter; it's a binary addition operation.