|  | 2021/06/03(Thu) 16:52:22 編集(投稿者) 
 ■No97539 (ちーず さん) に返信
 >>private void MakeList<T>(string s, List<IModel> dataList) where T : IModel
 > この形で書いてみたのですが、次は呼び出し元でエラーが出てしまいます。
 
 引数に T 型がないので型推論は効きません。
 型引数を明示する必要があります。
 
 var a = new List<Model1>();
 MakeList<Model1>("Example", a);
 var b = new List<IModel>();
 MakeList<IModel>("Example", b);
 
 
 または
 var c = new Hoge<Model1>();
 c.MakeList("Example", list);
 のように、オブジェクトの上位で型引数を決めるという手もあります。
 
 
 型推論を利かせたいなら
 private void MakeList<T>(string s, List<T> dataList) where T : IModel, new()
 {
 dataList.Add(new T { Name = s });
 }
 のようにします。これなら型引数無しで
 var a = new List<Model1>();
 MakeList("Example", a);
 と書けます。ただし
 var b = new List<IModel>();
 MakeList("Example", b);
 はできません。
 
 
 ところで、そもそも今回の質問範囲を見る限りでは
 ジェネリック メソッドにする意図が見えません。
 
 dataList を列挙している様子も無いですし、
 結果的に T も使われていないようです。
 内部で『dataList.Add(new Model()』することが目的なら
 private void MakeList(string s, List<Model> dataList)
 private void MakeList(string s, List<IModel> dataList)
 などで良いのでは無いでしょうか。
 
 あるいはファイルを IModel へとパースする目的であれば、
 List<> は呼び出し側に用意させるのではなく、
 // private List<T> MakeList<T>(string s) where T : IModel
 private IEnumerable<T> MakeList<T>(string s) where T : IModel
 のように、戻り値として return させた方が使いやすい気がします。
 これなら yield も使えますし。
 
 |