Pal*_*ama 5 c# generics inheritance casting covariance
为了避免混淆,我总结了一些代码:
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
IManager<ISpecificEntity> specificManager = new SpecificEntityManager();
IManager<IIdentifier> manager = (IManager<IIdentifier>) specificManager;
manager.DoStuffWith(new SpecificEntity());
}
}
internal interface IIdentifier
{
}
internal interface ISpecificEntity : IIdentifier
{
}
internal class SpecificEntity : ISpecificEntity
{
}
internal interface IManager<TIdentifier> where TIdentifier : IIdentifier
{
void DoStuffWith(TIdentifier entity);
}
internal class SpecificEntityManager : IManager<ISpecificEntity>
{
public void DoStuffWith(ISpecificEntity specificEntity)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我调试代码时,我得到一个InvalidCastException Main()
.
我知道那个ISpecificEntity
工具IIdentifier
.但显然从一个直接演员IManager<ISpecificEntity>
到一个IManager<IIdentifier>
不起作用.
我以为与协工作可以做的伎俩,但改变IManager<TIdentifier>
成IManager<in TIdentifier>
也没有帮助.
那么,有没有办法specificManager
投入IManager<IIdentifier>
?
谢谢,一切顺利.
随IManager<IIdentifier>
你可以做这样的事情:
IIdentifier entity = new NotSpecificEntity();
manager.DoStuffWith(entity);
Run Code Online (Sandbox Code Playgroud)
这将导致您的异常,SpecificEntityManager
因为它只接受类型的参数ISpecificEntity
更新:您可以在Eric Lippert的博客中阅读有关C#中的协方差和逆变的更多信息
归档时间: |
|
查看次数: |
221 次 |
最近记录: |