Я понимаю, что это потому, что функция DownloadCompletedCallback объявлена как статическая, но я не понимаю, почему это важно.
Из спецификации C #:
Метод, объявленный со статическим модификатором, является статическим методом.Статический метод не работает с конкретным экземпляром и может напрямую обращаться только к статическим элементам.Метод, объявленный без статического модификатора, является методом экземпляра.
Метод экземпляра работает с конкретным экземпляром и может обращаться как к статическим, так и к членам экземпляра.К экземпляру, для которого был вызван метод экземпляра, можно получить явный доступ как этот.Ошибочно ссылаться на это в статическом методе.
Это потому, что статические методы не являются частью объекта, поэтому они не могут взаимодействовать с чем-либо, что есть.Они привязаны к классу, который не имеет понятия состояния, поэтому при его вызове статический метод не имеет представления, с каким объектом должны взаимодействовать нестатические переменные объекта.
Пример, почему это запрещено:
Class Example{...}
var ExampleOne = new Example();
var ExampleTwo = new Example();
Example.CallStaticMethod();
Итак, теперь возникает вопрос, с какими нестатическими переменными он должен взаимодействовать?Должно ли это быть ExampleOne
или ExampleTwo
, или просто выдать исключение нулевой ссылки.В первых двух случаях у системы нет возможности узнать, с чем она должна взаимодействовать, потому что вы никогда не указывали ее (или это был бы метод экземпляра).В-третьих, это не совсем статично, так как вам нужен экземпляр для его вызова.Поэтому доступ к свойствам нестатических методов и т. Д. Должен быть запрещен, потому что слишком много двусмысленности, чтобы этого не делать.