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