#c# #.net #timer #event-handling #eventhandler
#c# #.net #таймер #обработка событий #eventhandler
Вопрос:
Если у меня есть EventHandler со следующей подписью:
public static void ProcessStuff(object sender, ElapsedEventArgs e)
И если я попытаюсь вручную вызвать EventHandler следующим образом:
ProcessStuff(this, System.Timers.ElapsedEventArgs.Empty);
Почему я получаю сообщение об ошибке:
Аргумент 2: не удается преобразовать из
'System.EventArgs'
в'System.Timers.ElapsedEventArgs'
РЕДАКТИРОВАТЬ: я также получаю то же сообщение об ошибке, если я устанавливаю ручной вызов как:
ProcessStuff(this, System.EventArgs.Empty);
Комментарии:
1.referencesource.microsoft.com/#System/services/timers/system /…
ElapsedEventArgs
не объявляется повторноEmpty
, и именно поэтомуSystem.Timers.ElapsedEventArgs.Empty
имеет типSystem.EventArgs
2. Как чертовски глупо.
Ответ №1:
Если мы посмотрим на https://referencesource.microsoft.com/#System/services/timers/system/timers/ElapsedEventArgs.cs,fa59a445f56b7851
мы увидим, что это System.Timers.ElapsedEventArgs
не объявляется повторно Empty
:
// No "Empty" (re-)declaration here
public class ElapsedEventArgs : EventArgs {
private DateTime signalTime;
internal ElapsedEventArgs(int low, int high) {
long fileTime = (long)((((ulong)high) << 32) | (((ulong)low) amp; 0xffffffff));
this.signalTime = DateTime.FromFileTime(fileTime);
}
public DateTime SignalTime {
get {
return this.signalTime;
}
}
}
и вот почему, когда мы вызываем, System.Timers.ElapsedEventArgs.Empty
мы на самом деле вызываем System.EventArgs.Empty
тип System.EventArgs
:
Console.Write(System.Timers.ElapsedEventArgs.Empty.GetType().Name);
Наконец, нет неявного приведения из System.EventArgs
в System.Timers.ElapsedEventArgs
Ответ №2:
Система.Таймеры.ElapsedEventArgs.Empty на самом деле не является пустым аргументом типа ElapsedEventArgs. Перейдя к определению (F12), вы увидите, что оно ведет к системе.EventArgs.Empty.
Поскольку оно является общедоступным, а ElapsedEventArgs наследуется от EventArgs, к нему также можно получить доступ через класс ElapsedEventArgs.