为什么 EventArgs 约束从 EventHandler<TEventArgs> 中删除?

问题描述

在 .NET Framework 2.0 中,委托 EventHandler 得到了它的泛化,允许第二个参数不仅是 EventArgs 类型,而且是派生类型,对其实现施加更严格的约束。但根据我在 likely in .NET Framework 4.5reference source 中发现的评论,在 .NET Framework 4 .NET Runtime source 中的某个时候,通用约束被删除了。

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace System
{
    public delegate void EventHandler(object? sender,EventArgs e);

    public delegate void EventHandler<TEventArgs>(object? sender,TEventArgs e); // Removed TEventArgs constraint post-.NET 4
}

但是放弃约束从而破坏与现有用户的兼容性有什么意义?或者,即使是 .NET 团队以外的人也可以对此负责,这样的动机是什么?

由于 SonarQube 规则 S3906,我遇到了这个过时的更改,它看起来像是已弃用的 CA1009 的副本,并且要求事件处理程序的类型需要 EventArgs 作为其第二个参数。这现在与 CA1003 冲突,后者需要使用通用 EventArgs。我选择通过 EditorConfig 抑制该问题,因为我无法更改 SonarQube 中的质量配置文件,但我仍然想知道为什么首先需要进行此重大更改。

我曾在 a great question regarding EventHandler<TEventArgs> variancea separate question 中看到过一个非常相似的问题,但我的问题没有在那里得到解答。他们的问题是约束为什么不存在(当前状态),我问的是为什么它被移除(改变的原因),感觉有点不同,因为原因需要足够强大来证明改变是合理的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...