Бессмысленное сообщение об ошибке при ручном вызове EventHandler - PullRequest
2 голосов
/ 14 марта 2019

Если у меня есть 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);

Ответы [ 2 ]

3 голосов
/ 14 марта 2019

Если мы посмотрим на 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) & 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 голосов
/ 14 марта 2019

System.Timers.ElapsedEventArgs.Empty на самом деле не является пустым аргументом типа ElapsedEventArgs.Переходя к определению (F12), вы увидите, что оно приводит к System.EventArgs.Empty.

Поскольку он является общедоступным, и ElapsedEventArgs наследует от EventArgs, он также доступен через класс ElapsedEventArgs.

...