ホームページ > バックエンド開発 > C++ > C# でオープン ジェネリック型のリストを作成するにはどうすればよいですか?

C# でオープン ジェネリック型のリストを作成するにはどうすればよいですか?

DDD
リリース: 2025-01-11 08:42:40
オリジナル
743 人が閲覧しました

How Can I Create a List of Open Generic Types in C#?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート