C# でのオープン ジェネリック型のリストの処理
C# でオープン ジェネリック型 (型パラメーターが指定されていないジェネリック) を扱う場合、ジェネリック多態性の制限により課題が生じます。
課題:
次のクラスについて考えてみましょう:
public abstract class Data<T> { } public class StringData : Data<string> { } public class DecimalData : Data<decimal> { }
これらの異なる Data
タイプのインスタンスを含むリストを作成しようとすると、直接失敗します:
List<Data> dataCollection = new List<Data>(); // Compiler error! dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());
Data
はオープン ジェネリック型であり、型引数を必要とするため、コンパイラ エラーが発生します。
解決策:
C# にはダイヤモンド演算子がないため、オープン ジェネリックのリストを直接インスタンス化できません。 ポリモーフィズムは、オープン ジェネリック型には直接適用されません。 回避策は、共通の基本型またはインターフェイスを使用することです:
public interface IData { void SomeMethod(); } public abstract class DataBase { public abstract void SomeMethod(); }
これで、インターフェイスまたは基本クラスを使用してリストを作成できます。
List<IData> dataList = new List<IData>(); dataList.Add(new StringData()); // StringData must implement IData dataList.Add(new DecimalData()); // DecimalData must implement IData foreach (var item in dataList) item.SomeMethod(); List<DataBase> dataBaseList = new List<DataBase>(); dataBaseList.Add(new StringData()); // StringData must inherit from DataBase dataBaseList.Add(new DecimalData()); // DecimalData must inherit from DataBase foreach (var item in dataBaseList) item.SomeMethod();
このアプローチでは、さまざまな Data
型のコレクションが可能ですが、真に汎用的なソリューションと比較して強力な型指定が犠牲になります。 SomeMethod()
の例は、異なる型間で機能を維持するための共通のインターフェイスまたは抽象メソッドの必要性を強調しています。
さらに読む:
以上がC# でオープン ジェネリック型のリストを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。