ホームページ >バックエンド開発 >C++ >C# リストは、異なる型パラメーターを持つ複数のジェネリック クラス インスタンスを保持できますか?

C# リストは、異なる型パラメーターを持つ複数のジェネリック クラス インスタンスを保持できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-18 16:36:09605ブラウズ

Can a C# List Hold Multiple Generic Class Instances with Different Type Parameters?

C# でジェネリック型のリストを作成できますか?

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>

抽象基本クラスを使用することで、さまざまな型のインスタンスを保持できるリストを作成できました MetadatamDataType にはこの属性が含まれていないため、リスト内の要素の MetadataBase 属性にアクセスする場合は型変換が必要であることに注意してください。 これは、型のチェックと変換に dynamic 型や is 演算子を使用するなど、ケースバイケースで処理する必要があります。

以上がC# リストは、異なる型パラメーターを持つ複数のジェネリック クラス インスタンスを保持できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。