Sea*_*ean 17 c# code-analysis .net-4.5 visual-studio-2012
更新:当代码分析选项"禁止生成代码的结果(仅限管理)"关闭,并且规则集设置为"Microsoft基本设计指南规则"时,会发生这种情况.
在2013-04-26,Microsoft确认这是一个错误,但不会在此版本或下一版本的Visual Studio中修复它.
我们经常使用空委托初始化事件处理程序,以避免检查空值.例如:
public EventHandler SomeEvent = delegate {};
Run Code Online (Sandbox Code Playgroud)
但是,自从开始在Visual Studio 2012(RTM)中编译我们的一些代码以来,我注意到派生类中的很多事件现在都在触发CA1601:不要在Visual Studio 2012的代码分析中隐藏基类方法警告.
这是一个会触发警告的示例:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:在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,它是在候选版本上就地安装的.
问题是 C# 编译器生成一个用于初始化实例委托的静态委托,该委托对于 Class1 和 Class2 的命名相同。
Class1.CS$<>9__CachedAnonymousMethodDelegate1存在供 Class1 的构造函数进行初始化PropertyCancelled,而Class2.CS$<>9__CachedAnonymousMethodDelegate1_存在供 Class2 的构造函数进行初始化SelectionCancelled。
不幸的是,C# 编译器在决定如何命名子类的自动生成的“东西”时,不包括父类的自动生成的“东西”的某种记录。在 ILDasm 中破解此漏洞,问题立即变得显而易见。很高兴知道您找到了解决方法。考虑到由于不符合 C# 的命名,您无法接触 C# 中的静态委托,因此忽略该警告是完全合理的。