На C# следующий код даёт ошибку компиляции:
using System;
namespace CSrharpApplicationTest
{
public class Program
{
public static void X()
{
}
public static void X(int x)
{
}
public static void Main(string[] args)
{
Delegate x = X; // Не знает что выбрать из двух перегрузок без явного приведения.
}
}
}
В PascalABC.NET выбирается 1-ая перегрузка. Это так задумано, или это баг?
procedure P() := Writeln(1);
procedure P(x: byte) := Writeln(2);
begin
var x: System.Delegate := P;
x.DynamicInvoke(); // 1
end.
Можно сделать поведение как в C#, а можно выдавать предупреждение, говорящее о том, что лучше в данной ситуации использовать приведение типов. С точки зрения обратной совместимости я бы выбрал второй вариант. Да и, вообще, второй.