我遇到了FxCop警告CA1006,Microsoft.Design"DoNotNestGenericTypesInMemberSignatures"的问题.具体来说,我正在设计一个ReportCollection<T>继承自的类,ReadOnlyCollection<Report<T>>其public构造函数将IList<Report<T>>一个参数作为参数.
修复此警告的建议不是很有用:
"要修复违反此规则的行为,请更改设计以删除嵌套类型参数." 到目前为止,我可以通过两种方式来改变设计:
internal.这在我的情况下不起作用.构造函数必须是public因为此集合类需要通过程序集外部的代码进行实例化.Report<T>[]而不是IList<Report<T>>.这是次优的,因为外部代码应该具有使用动态大小的数据结构的灵活性,List<T>而不是固定大小的数组.在这一点上,我放弃并压制了这个警告.有更好的解决方案吗?
mhe*_*384 32
我会接受FxCop的警告,好像它们是来自极度肛门保留的同事的建议.忽略(压制)它建议的一些事情是完全可以的.
小智 22
我同意,另一个忽视这条规则的好时机是你需要说:
Func<IEnumerable<T>>
Run Code Online (Sandbox Code Playgroud)
当然你可以使用非通用IEnumerable,但只要它实现IEnumerable(非泛型),就可以使用任何类型.泛型(部分)的目的是限制对给定类型集合可授予的类型.
我认为这个规则非常愚蠢.如果您有多个嵌套的泛型类型,则只需要它.一层嵌套不仅安全.
顺便说一句,我认为很多LINQ函数也嵌套了泛型类型,所以如果MS这样做,我们也可以:)
我同意您可以在以下情况下忽略CA1006警告:
Func<IEnumerable<T>>
Run Code Online (Sandbox Code Playgroud)
另外,您可以使用委托简化代码,而不必使用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 );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7133 次 |
| 最近记录: |