更新:当代码分析选项“禁止生成的代码的结果(仅限管理)”关闭,并且规则集设置为“Microsoft基本设计指南规则”时,会发生这种情况。为什么空委托事件处理程序会导致CA1061警告?
在2013-04-26,微软确认这是一个错误,但不会在本版本或下一版本的Visual Studio中修复它。
我们经常初始化事件处理程序有一个空的委托,以避免检查空值的需要。例如: -
public EventHandler SomeEvent = delegate {};
然而,由于开始编译一些我们的代码在Visual Studio 2012(RTM),我注意到很多派生类的事件现在都触发在Visual Studio 2012的代码分析CA1601: Do not hide base class methods警告。
这里将触发报警的样本:
using System;
using System.ComponentModel;
[assembly: CLSCompliant(true)]
namespace TestLibrary1
{
public abstract class Class1
{
public event PropertyChangedEventHandler PropertyChanged = delegate {};
}
public class Class2 : Class1
{
// this will cause a CA1061 warning
public event EventHandler SelectionCancelled = delegate { };
}
public class Class3 : Class1
{
// this will not cause a CA1061 warning
public event EventHandler SelectionCancelled;
}
}
注:在VS2012中编译时,报警被触发或者.NET 4.5或.NET 4.0。相同的示例不会在VS2010中触发警告。
不考虑性能的原因,是否有任何合法的原因,我们不应该用空代表初始化事件?默认的假设是,它可能只是在分析一个怪癖在Visual Studio 2012
这里的那些代码分析结果没有获得VS2012尚未:
CA1061不要隐藏基类方法更改或删除'Class2.Class2()',因为它隐藏了更具体的基类方法:'Class1.Class1()'。 TestLibrary1的Class1.cs 14
附录:我发现,在代码分析“抑制从生成的代码的结果的”选项关闭。
而且,我发现,这似乎当在基本类型的事件处理程序都发生:
- 比在基类和两个事件处理或事件处理程序 - 和 -
- 事件等代表派生类将使用匿名方法或空委托(内联或构造函数)进行初始化。
可能的相关性:我们正在运行Visual Studio 2012 RTM,它是通过候选版本就地安装的。
您是否正在初始化您的EventHandlers以避免在启动之前对它们进行空检查? – 2012-08-16 19:40:36
这是主要原因,是的。 – Sean 2012-08-16 19:54:35
它在我看来是VS 2012的一个怪癖。如果你覆盖了基类中的委托,我可能会看到它,但就目前而言,它看起来完全不符合CA1061的描述:http ://msdn.microsoft.com/en-us/library/ms182143.aspx – 2012-08-16 20:34:47