Почему объявление делегата статической причиной приводит к ошибке компилятора «Модификатор« статический »недопустим для этого элемента»? - PullRequest
3 голосов
/ 08 апреля 2011

Это дает мне ошибку компилятора:

public static delegate void SomeCoolDelegate();

Почему?

Ответы [ 5 ]

6 голосов
/ 08 апреля 2011

Это не имеет значения для делегата;Я имею в виду, семантически, это все равно что сказать, что я никогда не хочу реализацию сигнатуры этого метода!

Вы можете объявить реализацию как статическую ...

 protected static SomeCoolDelegate SomeMethod { get; set; }

Когда вы помечаете класс как статическийВы говорите, что никогда не хотите, чтобы это было реализовано.Делегат - это просто способ идентификации сигнатуры метода.

4 голосов
/ 08 апреля 2011

Объявление delegate означает тип. Делегатов в C # нельзя сделать static. Если вы хотите объявить переменную типа делегата, вы должны сделать что-то вроде этого:

public delegate void SomeCoolDelegate(); // declare a type called SomeCoolDelegate
public static SomeCoolDelegate foo; // declare foo as an object of type SomeCoolDelegate
2 голосов
/ 08 апреля 2011

Объявление делегата - это объявление типа.Это делает очень мало, поскольку тип, который содержит только методы экземпляра, должен быть объявлен статическим.

1 голос
/ 09 апреля 2011

Хорошо, так что я думаю, что происходит так:

Объявление делегата действительно требует от компилятора создать для вас новый специальный класс. Задача этого класса - действовать как указатель на функцию (или несколько указателей на функции, если необходимо).

Компилятор обязуется, создав новый класс, когда вы будете руководить всеми вещами, необходимыми для выполнения вашей работы с делегатом. Он создаст этот класс, но все, что вы получите, это методы и свойства уровня экземпляра и т. Д.

Таким образом, объявление делегата как статического не имеет смысла (как указали JaredPar и другие). Вы говорите: «Дайте мне статический класс, в котором все кишки не статичны (и, следовательно, недоступны) и т. Д. И т. П.»

0 голосов
/ 08 апреля 2011

Делегат - это тип, в перспективе тип во время выполнения - это просто классификация хранилища данных как папки, содержащей элементы, нет смысла делать тип статическим, потому что тип в любом случае статический. Член любого типа может быть статичным.

C # позволяет вам писать статические классы, чтобы ограничить возможности разработчиков писать только статические члены в типе, но это не означает, что тип является статическим или нет.

...