手动调用 EventHandler 时出现无意义的错误消息
Nonsense error message when manually calling EventHandler
如果我有一个具有以下签名的 EventHandler:
public static void ProcessStuff(object sender, ElapsedEventArgs e)
如果我尝试像这样手动调用 EventHandler:
ProcessStuff(this, System.Timers.ElapsedEventArgs.Empty);
为什么我会收到错误消息:
Argument 2: cannot convert from 'System.EventArgs'
to
'System.Timers.ElapsedEventArgs'
编辑: 如果我将手动调用设置为:
,我也会收到相同的错误消息
ProcessStuff(this, System.EventArgs.Empty);
System.Timers.ElapsedEventArgs.Empty 实际上不是 ElapsedEventArgs 类型的空 arg。通过定义 (F12),您会看到它导致 System.EventArgs.Empty。
由于是public,而且ElapsedEventArgs继承自EventArgs,所以也可以通过ElapsedEventArgs访问class。
我们会看到 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
如果我有一个具有以下签名的 EventHandler:
public static void ProcessStuff(object sender, ElapsedEventArgs e)
如果我尝试像这样手动调用 EventHandler:
ProcessStuff(this, System.Timers.ElapsedEventArgs.Empty);
为什么我会收到错误消息:
Argument 2: cannot convert from
'System.EventArgs'
to'System.Timers.ElapsedEventArgs'
编辑: 如果我将手动调用设置为:
,我也会收到相同的错误消息ProcessStuff(this, System.EventArgs.Empty);
System.Timers.ElapsedEventArgs.Empty 实际上不是 ElapsedEventArgs 类型的空 arg。通过定义 (F12),您会看到它导致 System.EventArgs.Empty。
由于是public,而且ElapsedEventArgs继承自EventArgs,所以也可以通过ElapsedEventArgs访问class。
我们会看到 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