|
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 も使えますし。
|