FxCop警告CA1006有什么好的解决方法吗?

时间:2009-01-06 18:29:07

标签: c# .net fxcop

我遇到了FxCop warning CA1006,Microsoft.Design“DoNotNestGenericTypesInMemberSignatures”的问题。具体来说,我正在设计一个继承自ReportCollection<T>的{​​{1}}类,其ReadOnlyCollection<Report<T>>构造函数将public作为参数。

修复此警告的建议不是很有用:

  

“要修复违反此规则的行为,请更改设计以删除嵌套类型参数。”到目前为止,我可以通过两种方式来改变设计:

  1. 制作构造函数IList<Report<T>>。这在我的情况下不起作用。构造函数必须是internal,因为此集合类需要通过程序集外部的代码进行实例化。
  2. 使构造函数采用public而不是Report<T>[]。这是次优的,因为外部代码应该具有使用动态大小的数据结构(如IList<Report<T>>而不是固定大小的数组)的灵活性。
  3. 此时,我已放弃并禁止此警告。有更好的解决方案吗?

3 个答案:

答案 0 :(得分:31)

我会接受FxCop的警告,好像它们是来自极度肛门保留的同事的建议。忽略(压制)它建议的一些事情是完全可以的。

答案 1 :(得分:22)

我同意,另一个忽略这条规则的好时机就是你需要说:

Func<IEnumerable<T>>

当然你可以使用非通用的IEnumerable,但是只要它实现了IEnumerable(非泛型),就可以使用任何类型。泛型(部分)的目的是限制对给定类型集合可授予的类型。

我认为这条规则非常愚蠢。如果您有多个嵌套的泛型类型,则只需要它。一层筑巢不仅安全。

顺便说一下,我认为很多LINQ函数也嵌套了泛型类型,所以如果MS这样做,我们也可以:)

答案 2 :(得分:4)

我同意您可以在

的情况下忽略CA1006警告
Func<IEnumerable<T>>

此外,您可以使用代理来简化代码并避免使用CA1006:

public delegate IEnumerable<T> ChildrenDel<T>( T parent);

// was: GetDescendants<T>( this T item, Func< T, IEnumerable< T > > children )

public static IEnumerable< T > GetDescendants<T>( this T item, ChildrenDel<T> children )
{
    var stack = new Stack< T >();
    do {
        children( item ).ForEach( stack.Push );

        if( stack.Count == 0 )
            break;

        item = stack.Pop();

        yield return item;
    } while( true );
}