ジェネリックとキャスト: キャストの制限を理解する
継承されたクラスを基底クラスにキャストすることはよくあることですが、次のように難しい場合があります。次のことを試みたときに実行時例外が発生しましたコード:
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) { ... }
Casting MyEntityRepository to RepositoryBase
C# 4 では、ジェネリック バリアンスは、ジェネリック インターフェイスおよびデリゲート内の参照型に対して許可されていますが、クラスに対しては許可されていません。詳細については、Microsoft の MSDN ドキュメント、Eric Lippert のブログ シリーズ、または 2010 年 7 月に NDC で行われたプレゼンテーションのビデオを参照してください。
以上がC# で `MyEntityRepository` から `RepositoryBase` へのキャストが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。