Делегаты и тип безопасности в C#

Приведенное ниже использование делегатов будет компилироваться без ошибок в C#

class Program
{
    delegate void SampleDelegate(int input);
    static void Main(string[] args)
    {
        SampleDelegate d = delegate
        {
            Console.WriteLine(5);
        };

        d(10);
    }
}

Хотя подпись "SampleDelegate" отличается от анонимного метода, который привязывается к экземпляру "SampleDelegate"

так что, если этот код правильный, то почему приведенный ниже код не скомпилируется и имеет ошибку

class Program
{
    delegate void SampleDelegate(int input);
    static void Main(string[] args)
    {
        SampleDelegate d = new SampleDelegate(TestFunction); 
    }

    static void TestFunction()
    {
        Console.WriteLine(5);
    }
}

и компилятор говорит:

Никакая перегрузка для 'TestFunction' не соответствует делегату 'Program.SampleDelegate'

Итак, мои вопросы:

1) Почему C# принимает первый синтаксис и не принимает второй, в то время как у них обоих нет входного параметра?

2) Как делегаты все еще являются безопасными указателями на функцию, в то время как C# принимает первый синтаксис?

0 ответов

Другие вопросы по тегам