手动调用EventHandler时出现废话错误消息

时间:2019-03-14 12:03:19

标签: c# .net timer event-handling 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);

2 个答案:

答案 0 :(得分:3)

如果我们看看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.EventArgsSystem.Timers.ElapsedEventArgs

没有隐式转换

答案 1 :(得分:2)

System.Timers.ElapsedEventArgs.Empty实际上不是ElapsedEventArgs类型的空arg。转到定义(F12),您将看到它导致了System.EventArgs.Empty。

由于它是公共的,并且ElapsedEventArgs继承自EventArgs,因此也可以通过ElapsedEventArgs类进行访问。