25

我遇到了FxCop 警告 CA1006、Microsoft.Design “DoNotNestGenericTypesInMemberSignatures”的问题。具体来说,我正在设计一个ReportCollection<T>继承自 的类,ReadOnlyCollection<Report<T>>public构造函数以 aIList<Report<T>>作为参数。

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

“要修复违反此规则的行为,请更改设计以删除嵌套类型参数。” 到目前为止,我可以看到有两种方法可以按照建议更改设计:

  1. 制作构造函数internal。这在我的情况下不起作用。构造函数必须是public因为这个集合类需要被程序集外部的代码实例化。
  2. 使构造函数采用 aReport<T>[]而不是IList<Report<T>>. 这是次优的,因为外部代码应该具有使用动态大小的数据结构List<T>而不是固定大小的数组的灵活性。

在这一点上,我已经放弃并压制了这个警告。有更好的解决方案吗?

4

3 回答 3

31

我会接受 FxCop 的警告,就好像它们是来自一位非常固执的同事的建议。忽略(抑制)它暗示的一些事情是完全可以的。

于 2009-01-06T18:55:48.463 回答
21

我同意,忽略此规则的另一个好时机是当您需要说:

Func<IEnumerable<T>>

当然你可以使用非泛型的 IEnumerable,但是任何类型都可以使用,只要它实现了 IEnumerable(非泛型)。泛型的目的(部分)是将允许的类型限制为给定的一组类型。

我认为这个规则非常愚蠢。仅当您嵌套了多个泛型类型时才需要它。一层嵌套非常安全。

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

于 2010-11-23T04:09:16.103 回答
5

我同意您可以在以下情况下忽略 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 );
}
于 2015-10-14T11:45:52.940 回答