Чтобы добавить к ответам Джона и Джареда, я отмечаю, что единственный раз, когда вы обычно определяете делегата внутри класса, это если он был частной деталью реализации класса. Редко и странно иметь public определение делегата внутри класса.
Например, рассмотрим мой любимый шаблон: абстрактный базовый класс, который может быть расширен только частными вложенными классами, изготовленными на фабриках:
public abstract class Animal
{
private Animal() { } // prevents subclassing from outside!
private sealed class Giraffe : Animal { }
private sealed class Leopard : Animal { }
public static Animal GetGiraffe( ) { return new Giraffe(); }
public static Animal GetLeopard( ) { return new Leopard(); }
Предположим, что деталь реализации Animal заключалась в том, что вам нужен делегат от Жирафа до Леопарда:
private delegate Leopard D(Giraffe g);
Это не может быть открытый класс делегата, поскольку он относится к закрытым типам!
В настоящее время, конечно, вы бы этого даже не сделали. Вы бы использовали Func<Giraffe, Leopard>
и все готово.
Следовательно, вложенный тип делегата в значительной степени существует для полноты и обратной совместимости в наши дни; обычно вы бы не использовали его.