【问题标题】:Nonsense error message when manually calling EventHandler手动调用 EventHandler 时出现无意义的错误消息
【发布时间】:2019-03-14 12:03:18
【问题描述】:

如果我有一个带有以下签名的 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);

【问题讨论】:

标签: c# .net timer event-handling eventhandler


【解决方案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) & 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 没有隐式转换

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-29
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2016-06-08
      相关资源
      最近更新 更多