6

我正在使用 StyleCop 和 FxCop 工具来改进我的代码,但我遇到了一个有两条规则的地方,一条在 StyleCop 中,一条在 FxCop 中,它们相互排斥。如果我修复我的代码以匹配来自 StyleCop 的规则,则 FxCop 验证失败,反之亦然。

第一条规则是来自 StyleCop 的 SA1200,它说所有 using 指令都必须放在命名空间内。

所有 using 指令都必须放在命名空间内。

所以我做了这样的事情

namespace MyNamespace
{
    using System;

    ...
}

StyleCop 没问题,没有更多警告。现在我运行 FxCop 验证,它告诉我违反了 CA1014:

用 CLSCompliant(true) 标记“MyApp.dll”,因为它公开了外部可见的类型。

为了解决这个问题,我应该这样做:

[ClsCompliant(true)]
namespace MyNamespace
{
    ...
}

但现在我无法构建我的项目,因为ClsCompliant无法识别属性(因为它来自System我包含在MyNamespace. 因此,如果我将using System; 指令移到MyNamespace声明之外。这将使我的代码编译,但它会再次违反 StyleCop 的规则。

除了禁用 StyleCop 或 FxCop 中的规则之一,还有什么办法可以解决这个问题?如果这不可能,我应该禁用哪些规则?哪个不太重要?

4

2 回答 2

15

使用完整的属性名称:

[System.CLSCompliant(true)]
namespace MyNamespace
{
    ...
}

顺便说一句:如果您想将整个程序集标记为 CLSCompliant,请将

[assembly: System.CLSCompliant(true)]

在 Properties/AssemblyInfo.cs 文件中

于 2009-09-03T07:41:51.033 回答
3

我的建议是关闭“所有 using 指令必须放在命名空间内”。StyleCop 中的规则。坚持它是不切实际的,特别是因为大多数代码生成器(甚至是 VS 自己的)都不遵循这种做法。

于 2009-09-12T05:01:30.190 回答