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 중국어 웹사이트의 기타 관련 기사를 참조하세요!