猿问

泛型和强制转换 - 不能将继承的类强制转换为基类

泛型和强制转换 - 不能将继承的类强制转换为基类

我知道这是旧的,但我仍然不太了解这些问题。任何人都可以告诉我为什么以下不起作用(抛出runtime关于投射的例外)?


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;

那么,任何人都可以解释这是如何无效的?而且,我没有心情去解释 - 是否有一行代码我可以用来实际进行演员表演?


富国沪深
浏览 698回答 3
3回答

噜噜哒

这需要协方差或逆变,其支持仅限于.Net,不能用于抽象类。您可以在接口上使用方差,因此您的问题的可能解决方案是创建一个IRepository,您可以使用它来代替抽象类。&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;interface&nbsp;IRepository<out&nbsp;T>&nbsp;where&nbsp;T&nbsp;:&nbsp;EntityBase&nbsp;{&nbsp;//or&nbsp;"in"&nbsp;depending&nbsp;on&nbsp;the&nbsp;items. &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;abstract&nbsp;class&nbsp;RepositoryBase<T>&nbsp;:&nbsp;IRepository<T>&nbsp;where&nbsp;T&nbsp;:&nbsp;EntityBase&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;MyEntityRepository&nbsp;:&nbsp;RepositoryBase<MyEntity>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;IRepository<EntityBase>&nbsp;baseRepo&nbsp;=&nbsp;(IRepository<EntityBase>)myEntityRepo;
随时随地看视频慕课网APP
我要回答