当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《FxCop警告CA1006有什么好的解决方法吗?》经验,为你挑选了3个好方法。

我遇到了FxCop警告CA1006,Microsoft.Design"DoNotNestGenericTypesInMemberSignatures"的问题.具体来说,我正在设计一个ReportCollection继承自的类,ReadOnlyCollection>public构造函数将IList>一个参数作为参数.

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

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

    制作构造函数internal.这在我的情况下不起作用.构造函数必须是public因为此集合类需要通过程序集外部的代码进行实例化.

    使构造函数取代Report[]而不是IList>.这是次优的,因为外部代码应该具有使用动态大小的数据结构的灵活性,List而不是固定大小的数组.

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



1> mhenry1384..:

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


+1它也是一个设计警告,所以有时这些可以真正被归类为审美,特别是如果你没有设计公共API.

2> 小智..:

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

Func>

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

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

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


我不会对嵌套的"安全"水平施加任何限制.通用类型应该嵌套在语义所需的深层次.对接口支持协方差和逆变的限制意味着需要例如`IDictionary >`的代码将无法接受`IDictionary >`,但是当嵌套时泛型在语义上是正确的我喜欢使用它们而不是试图解决它们.

3> Roman Koshel..:

我同意您可以在以下情况下忽略CA1006警告:

Func>

另外,您可以使用委托简化代码,而不必使用CA1006:

public delegate IEnumerable ChildrenDel( T parent);

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

public static IEnumerable< T > GetDescendants( this T item, ChildrenDel 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 );
}

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有