如何解决使用通用类型接口
我有一个接收通用类型的接口,我们称其为IFoo。该通用类型仅限于由不同的接口IBar实现。这两个接口的定义如下:
internal interface IFoo<out TBar> where TBar : IBar
{
}
internal interface IBar
{
}
然后我创建了两个类,每个类都实现了上面创建的接口:
internal class SpecificFoo : IFoo<SpecificBar>
{
}
internal class SpecificBar : IBar
{
}
一切正常,并且实例化SpecificFoo不会产生任何编译错误,因为在定义通用类型IBar时使用了协方差。
// No compile error and instantiation works!
IFoo<IBar> correctFoo = new SpecificFoo();
由于我始终将接口IFoo与接口IBar一起使用来存储派生类的新实例,因此我的代码中的变量IFoo类型遍布各处。为了简化此定义,我为IFoo接口创建了第二个变体:
internal interface IFoo : IFoo<IBar>
{
}
问题在于,现在新对象的实例化无法像以前一样起作用。
// Compile error!!
IFoo incorrectFoo = new SpecificFoo();
// Cast error!!
IFoo alsoIncorrectFoo = (IFoo)new SpecificFoo();
为什么编译器“不够聪明”,不足以理解IFoo或具有通用类型IBar的IFoo是同一件事?而且为什么强制转换不起作用?
解决方法
如果我了解问题所在,则需要使SpecificFoo
实现IFoo
internal class SpecificFoo : IFoo<SpecificBar>,IFoo
{ .. }
哪个可以允许您
IFoo correctFoo = new SpecificFoo();
//and
IFoo<IBar> anotherFoo = correctFoo;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。