Множественная перезагрузка 1 и того же оператора

procedure operator+=<T>(var a: array of T; b: array of T); extensionmethod := a := a + b;

procedure operator+=<T>(var a: array of T; b: array of T); extensionmethod := a := b;

begin
  var a := Arr(1,2,3);
  var b := Arr(4,5,6);
  a += b;
  writeln(a);
end.

Выведет результат первой перезагрузки оператора +=, вторую просто проигнорирует. По логике должно было или вызвать ошибку или использовать последнюю перезагрузку.

Наверное первым в голову приходит что такое надо запретить, но возможно это и не так однозначно. У кого какие мысли по этому поводу?

Я сам считаю что надо разрешить и вызывать последнюю перезагрузку, тогда можно делать так:

procedure operator+=<T>(var a: SomeType; b: SomeType2); extensionmethod;
begin
  //первый способ складывать SomeType и SomeType2
end;

type
  ClassWithCalcType1=class
    
    //какое то использование перезагруженной операции
    
  end;

procedure operator+=<T>(var a: SomeType; b: SomeType2); extensionmethod;
begin
  //второй способ складывать SomeType и SomeType2
end;

type
  ClassWithCalcType2=class
    
    //какое то использование новой перезагруженной операции
    
  end;

Конечно, такое можно реализовать создав под каждый из таких классов отдельный модуль, но так ведь удобнее.

Я счтитаю, что это должно быть ошибкой.

1 лайк

Давайте подробнее, почему именно.

Допустим, я хотел перегрузить оператор += и -=, но по ошибке написал дважды перегрузку для +=. Если компилятор будет допускать множественную перегрузку, то мне придётся потратить какое то время на поиск такой опечатки. Но если будет ошибка компиляции, то я сразу исправлю код.