25

FxCop警告CA1006、Microsoft.Design「DoNotNestGenericTypesInMemberSignatures」で問題が発生しました。具体的には、ReportCollection<T>から継承するクラスを設計してReadOnlyCollection<Report<T>>おり、そのpublicコンストラクターはIList<Report<T>>パラメーターとしてを取ります。

この警告を修正するための提案はあまり役に立ちません。

「このルールの違反を修正するには、ネストされた型の引数を削除するようにデザインを変更してください。」提案されているようにデザインを変更するには、これまでに2つの方法があります。

  1. コンストラクターを作成しinternalます。私の場合、これは機能しません。publicこのコレクションクラスは、アセンブリの外部のコードによってインスタンス化できる必要があるため、コンストラクターが必要です。
  2. コンストラクターに。のReport<T>[]代わりにを使用させIList<Report<T>>ます。List<T>外部コードには、固定サイズの配列の代わりに動的なサイズのデータ​​構造を使用できる柔軟性が必要であるため、これは最適ではありません。

この時点で、私はこの警告をあきらめて抑制しました。より良い解決策はありますか?

4

3 に答える 3

31

私は FxCop の警告を、あたかも非常に肛門にこだわる同僚からの提案であるかのように受け止めます。それが示唆することのいくつかを無視 (抑制) することは完全に問題ありません。

于 2009-01-06T18:55:48.463 に答える
21

このルールを無視するもう 1 つの良いタイミングは、次のように言う必要がある場合です。

Func<IEnumerable<T>>

もちろん、非ジェネリック IEnumerable を使用することもできますが、IEnumerable (非ジェネリック) を実装している限り、任意の型を使用できます。ジェネリックスの目的の一部は、特定の型セットに許容される型を制限することです。

このルールはとてもばかげていると思います。複数のジェネリック型がネストされている場合にのみ必要です。ネストの 1 層は安全以上です。

ところで、LINQ 関数の多くはジェネリック型もネストしていると思うので、MS がそうするなら、私たちもできます :)

于 2010-11-23T04:09:16.103 に答える