C# では、ジェネリック型パラメーターを使用してクラスを作成できます。しかし、異なる型パラメータを持つこのジェネリック クラスの複数の異なるインスタンスを含むリストを作成することは可能でしょうか?
次の例を考えてみましょう:
<code class="language-csharp">public class Metadata<DataType> where DataType : struct { private DataType mDataType; }</code>
ここには、さまざまな値の型に使用できるジェネリック クラス Metadata
があります。ここで、さまざまなタイプを持つこれらの Metadata
オブジェクトのリストを作成するとします。できるでしょうか?
<code class="language-csharp">List<Metadata<DataType>> metadataObjects; // 错误:DataType 未定义 metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
残念ながら、リストのジェネリック型パラメーターはすべての要素で同じである必要があるため、これは C# では不可能です。この制限を克服するには、継承クラスと抽象クラスを使用できます。
<code class="language-csharp">public abstract class MetadataBase { } // 继承抽象 MetadataBase 类 public class Metadata<DataType> : MetadataBase where DataType : struct { private DataType mDataType; }</code>
これで、抽象基本クラス MetadataBase
のリストを作成できます。これにより、さまざまなタイプの Metadata
オブジェクトをリストに追加できます:
<code class="language-csharp">List<MetadataBase> metadataObjects = new List<MetadataBase>(); metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
抽象基本クラスを使用することで、さまざまな型のインスタンスを保持できるリストを作成できました Metadata
。 mDataType
にはこの属性が含まれていないため、リスト内の要素の MetadataBase
属性にアクセスする場合は型変換が必要であることに注意してください。 これは、型のチェックと変換に dynamic
型や is
演算子を使用するなど、ケースバイケースで処理する必要があります。
以上がC# リストは、異なる型パラメーターを持つ複数のジェネリック クラス インスタンスを保持できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。