|
> public IEnumerable<string> GetNames() > { > // Listクラスを返す > }
戻り値を List<string> や IList<string> にしない理由は何でしょうか?
> namesに対してインデクサでアクセスしたい場合や .ElementAt(n) とか。
> 要素を追加、削除したい場合にListや配列に変換しなければ > ならないかと思います。 IList であれば、追加や削除が可能ですよね。
List<T> は IList<T>, IList ICollection<T>, ICollection IEnumerable<T>, IEnumerable IReadOnlyList<T> IReadOnlyCollection<T> というインターフェイス群をサポートしているのですから、 GetName が List<string> を返すのなら、利用側としても 追加や削除に困ることは無いと思うのですが…。
> 引数はListや配列を受け取れるようにするため > IEnumerableやIListで定義するべきかと思うのですが その根拠が良く分かりませんでした。
IList<T> は追加や削除もサポートしていますが、 IEnumerable<T> は列挙が目的の型であって、 追加や加工は別の話ですよね。
加工が必要なら、加工をサポートした型を受け入れれば良い話であって、 IEnumerable として扱おうとしているオブジェクトに対して、 「要素を追加、削除したい場合にListや配列に変換しなければならない」 という状況になるとは思えませんでした。
受け取ったオブジェクトに対して直接、要素を追加、削除していくというのではなく、 各要素をシャローコピーして新たなコレクションに詰めなおす、だとか、 Linq を用いて 別の IEnumerable<T> インスタンスにする、というのなら分かりますが。
|