手动调用事件处理程序时出现无意义的错误消息



如果我有一个具有以下签名的事件处理程序:

public static void ProcessStuff(object sender, ElapsedEventArgs e)

如果我尝试像这样手动调用事件处理程序:

ProcessStuff(this, System.Timers.ElapsedEventArgs.Empty);

为什么我会收到错误消息:

参数 2:无法从'System.EventArgs'转换为'System.Timers.ElapsedEventArgs'

编辑:如果我将手动调用设置为:

ProcessStuff(this, System.EventArgs.Empty);

如果我们看看 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.EmptySystem.EventArgs类型:

Console.Write(System.Timers.ElapsedEventArgs.Empty.GetType().Name);

最后,没有从System.EventArgsSystem.Timers.ElapsedEventArgs隐式转换

System.Timers.ElapsedEventArgs.Empty 实际上不是 ElapsedEventArgs 类型的空参数。通过转到定义(F12),您将看到它指向System.EventArgs.Empty。

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

相关内容

  • 没有找到相关文章

最新更新