Applicable function member

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 for a value parameter or a parameter array, an implicit conversion (13.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 (13.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.