제네릭 및 캐스팅: 캐스팅 제한 이해
일반적인 발생에도 불구하고 상속된 클래스를 기본 클래스로 캐스팅하는 것은 까다로울 수 있습니다. 다음 코드를 시도할 때 런타임 예외가 발생했습니다.
public abstract class EntityBase { } public class MyEntity : EntityBase { } public abstract class RepositoryBase<T> where T : EntityBase { } public class MyEntityRepository : RepositoryBase<MyEntity> { } MyEntityRepository myEntityRepo = GetMyEntityRepo(); // whatever RepositoryBase<EntityBase> baseRepo = (RepositoryBase<EntityBase>)myEntityRepo;
이 캐스팅은 실패합니다. RepositoryBase
이 제한의 근본적인 이유는 일반 분산의 개념에 있습니다. 일반 분산은 공변 또는 반공변 방식으로 매개변수화를 변경하는 유형의 기능을 나타냅니다. 그러나 이러한 형태의 제네릭 변형은 주로 제네릭 인터페이스 및 대리자에 대해 C#에서 부분적으로만 지원됩니다.
더 일반적인 맥락에서 공변 변형을 사용하면 주어진 시나리오에서 파생 유형이 기본 유형을 대체할 수 있습니다. . 이는 RepositoryBase
예를 들어 RepositoryBase
void Add(T entity) { ... }
MyEntityRepository를 RepositoryBase
C# 4에서는 일반 인터페이스 및 대리자 내의 참조 유형에 일반 변형이 허용되지만 클래스에는 허용되지 않습니다. 자세한 내용은 Microsoft의 MSDN 설명서, Eric Lippert의 블로그 시리즈 또는 2010년 7월 NDC에서 발표된 프레젠테이션 비디오를 참조하세요.
위 내용은 C#에서 `MyEntityRepository`를 `RepositoryBase`로 캐스팅하는 데 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!