次のように、 2 つの型パラメーターが必要な場合があります。
private static void PrintEachItemInList<TList, TItem>(TList anyType)
where TList : System.Collections.Generic.List<TItem>
これは、実際に から派生したクラスを使用する場合に便利ですList<>。リストとして機能するものが必要な場合は、代わりにインターフェイス に制限することを検討してください。IList<>その後、List<>、一次元配列、およびインターフェイスを実装するカスタム クラスで機能します (ただし、必ずしも から派生するとは限りませんList<>)。
編集:コメントで指摘されているように、コンパイラは 2 つの型引数を推測しないため、このメソッドは使いにくいため、メソッドを呼び出すときに明示的に指定する必要があります。
使用することを検討してください:
private static void PrintEachItemInList<TItem>(List<TItem> anyType)
a から派生するものはすべて にList<>代入可能であるためList<>、派生クラスを引数としてメソッドを呼び出すことができ、多くの場合、型TItemはコンパイラによって自動的に推測されます。
インターフェイスの使用を検討してIList<>ください。
やりたいことがすべてリストから読み取らIReadOnlyList<TItem>れる場合は、代わりに を使用しIList<TItem>ます。これは、発信者のリストを変更しないことを発信者に知らせます。呼び出すときにキャスト構文はまだ必要ありません。たとえば、PrintEachItemInList(new[] { 2, 3, 5, 7, });. この型IReadOnlyList<>は .NET バージョン 4.5 で新しく追加されました。
リストから読み取るだけで、インデクサーを使用したくない場合 (no anyType[idx])、.Countプロパティを使用したくない場合、実際にforeachはリストを使用するだけで済みます。 、使用IEnumerable<TItem>。繰り返しますが、ユーザーのリストを変更しないことを示しています。
IReadOnlyList<>とIEnumerable<>はどちらも、ジェネリック引数 (型パラメーター) で共変です。