Почему тип отправителя имеет значение null при работе с событиями - PullRequest
5 голосов
/ 28 мая 2010

Из C # через CLR:

Примечание. Многие люди задаются вопросом, почему шаблон события требует отправителя параметр всегда должен иметь тип Object В конце концов, так как MailManager будет быть единственным типом, поднимающим событие с объект NewMail EventArgs, он делает больше смысла для метода обратного вызова быть прототипом так:

void MethodName(MailManager sender, NewMailEventArgs e);

Шаблон требует отправителя параметр должен быть типа объекта в основном из-за наследства Что делать, если Май lManager были использованы в качестве базового класса для SmtpMailManager? В этом случае метод обратного вызова должен иметь параметр отправителя прототипируется как SmtpMailManager вместо Почты Менеджер, но этого не может быть, потому что SmtpMai lManager только что унаследовал NewMai l event Так что код был ожидая, что SmtpMail Manager поднимет событие все еще должно разыграть аргумент отправителя для SmtpMailManager In Другими словами, актерский состав все еще обязательно, поэтому параметр отправителя может также быть напечатано как Object.

Следующая причина для ввода отправителя Параметр как объект просто Это позволяет делегату использоваться несколькими типами, которые предлагают событие, которое проходит NewMail Объект EventArgs Например, Класс PopMai lManager может использовать делегировать, даже если этот класс не был получено из Mail Manager

Я просто не могу понять, почему отправитель является объектом. Почему его нельзя обобщить? так что большую часть времени нам не нужно делать общие приведения

Ответы [ 2 ]

7 голосов
/ 28 мая 2010

Обобщения не существовали в C # версии 1.

3 голосов
/ 28 мая 2010

Даже если бы дженерики были реализованы вокруг этого, у вас все равно была бы та же проблема. Внутри вашего MailManager объекта вы бы назвали this.EventName<MailManager>(this, args), и поэтому он будет соответствовать только людям, подписавшимся на это типизированное событие.

Конечно, они могли бы переработать весь способ, которым CLR ищет методы и события, чтобы он был очень свободным. Тогда у нас был бы Javascript # вместо C #, хотя: p

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...