Бессмысленное сообщение об ошибке при ручном вызове EventHandler

#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.