A function member is said to be an applicable function member with respect
to an argument list A when all
of the following are true:
?The number of arguments in A is identical to the number of parameters in
the function member
declaration.
?For each argument in A, the parameter passing mode of the argument (i.e.,
value, ref, or out) is
identical to the parameter passing mode of the corresponding parameter, and
Chapter 14 Expressions
135
for a value parameter or a parameter array, an implicit conversion (?3.1)
exists from the type of the
argument to the type of the corresponding parameter, or
for a ref or out parameter, the type of the argument is identical to the
type of the corresponding parameter.
[Note: After all, a ref or out parameter is an alias for the argument
passed. end note]
For a function member that includes a parameter array, if the function
member is applicable by the above
rules, it is said to be applicable in its normal form. If a function member
that includes a parameter array is
not applicable in its normal form, the function member may instead be
applicable in its expanded form:
?The expanded form is constructed by replacing the parameter array in the
function member declaration
with zero or more value parameters of the element type of the parameter
array such that the number of
arguments in the argument list A matches the total number of parameters. If
A has fewer arguments than
the number of fixed parameters in the function member declaration, the
expanded form of the function
member cannot be constructed and is thus not applicable.
?If the class, struct, or interface in which the function member is
declared already contains another
applicable function member with the same signature as the expanded form,
the expanded form is not
applicable.
?Otherwise, the expanded form is applicable if for each argument in A the
parameter passing mode of the
argument is identical to the parameter passing mode of the corresponding
parameter, and
for a fixed value parameter or a value parameter created by the expansion,
an implicit conversion (?3.1)
exists from the type of the argument to the type of the corresponding
parameter, or
for a ref or out parameter, the type of the argument is identical to the
type of the corresponding parameter.