В C # делегаты - не более чем указатели на методы .Они могут указывать на существующие методы в классе или на независимые анонимные объекты-делегаты.
Этот абзац из приведенной выше ссылки должен объяснить, что происходит в вашем коде:
Любой метод, который соответствуетподпись делегата, состоящая из возвращаемого типа и параметров, может быть назначена делегату.Это позволяет программно изменять вызовы методов, а также вставлять новый код в существующие классы.Если вам известна подпись делегата, вы можете назначить собственный делегированный метод.
То есть при разрешении типов делегатов учитываются их подписи, а не их имена.
В вашем случае ваши F1()
и F2()
методы, не принимающие параметров и не возвращающие ничего, имеют совпадающие подписи с безпараметрическим Action
делегатом :
public delegate void Action();
Следовательно,они неявно преобразуются в Action
.
Если вы попытаетесь передать метод с другим типом возвращаемого значения или хотя бы одним параметром, вы получите ошибку времени компиляции, поскольку она не будет соответствоватьAction
подпись.