Приведение к типу делегата

На 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#, а можно выдавать предупреждение, говорящее о том, что лучше в данной ситуации использовать приведение типов. С точки зрения обратной совместимости я бы выбрал второй вариант. Да и, вообще, второй.

Мне больше нравится ошибка компиляции. Хотя использование вот этих сырых нетипизированных предков всех делегатов это плохая практика. Вызывать то надо через Invoke. А это какой то крайний случай когда по другому нельзя. Еще один особый случай получается.

1 лайк