Делегаты и тип безопасности в 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# принимает первый синтаксис?