次のように、 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<>
はどちらも、ジェネリック引数 (型パラメーター) で共変です。