Все вышеописанные способы переопределения методов хорошо работают для позиционных аргументов. Но с именованными аргументами может произойти путаница, в результате будет получена ошибка неоднозначности.
Например, метод перегружен следующим образом:
// 1-й вариант
метод Метод1(Парам1: Строка, Парам2: Число)
// 2-й вариант
метод Метод1(Парам2: Число, Парам1: Строка)
С позиционными аргументами ошибки не возникнет – при вызове будет однозначно выбран первый вариант определения метода Метод1().
метод МойМетод()
Метод1("тест", 11)
;
А с именованными аргументами возникнет ошибка неоднозначности, так как параметры передаются по именам, а не по порядку вызова. В результате для именованных аргументов подходят оба варианта определения метода Метод1().
метод МойМетод()
//ошибка компиляции – неоднозначный вызов метода с именованными параметрами
Метод1(Парам1 = "тест", Парам2 = 11)
;
При этом, если есть несколько перегрузок, подходящих для именованных аргументов, и среди них существует такая, что общее число ее аргументов меньше, чем у всех остальных, – будет выбрана она. Например, в следующем примере для двух именованных аргументов метода Метод2() будет выбран второй вариант определения метода, так как в нем описаны два параметра, а не три, как в первом варианте:
метод МойМетод()
Метод2(Парам1 = 22, Парам3 = Ложь)
;
// 1-й вариант
метод Метод2(Парам1: Число, Парам2 = "тест", Парам3 = Истина)
// 2-й вариант
метод Метод2(Парам1: Число, Парам3: Булево)