作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个接收泛型类型的接口(interface),我们称之为 IFoo。该泛型类型被限制为由不同的接口(interface) IBar 实现。这两个接口(interface)定义如下:
internal interface IFoo<out TBar> where TBar : IBar
{
}
internal interface IBar
{
}
然后我创建了两个类,每个类都实现了上面创建的接口(interface):
internal class SpecificFoo : IFoo<SpecificBar>
{
}
internal class SpecificBar : IBar
{
}
一切正常,实例化 SpecificFoo 不会产生任何编译错误,因为在定义泛型类型 IBar 时使用了协方差。
// No compile error and instantiation works!
IFoo<IBar> correctFoo = new SpecificFoo();
由于我总是使用接口(interface) IFoo 和接口(interface) IBar 来存储派生类的新实例,因此我的代码中散布着 IFoo 类型的变量。为了简化这个定义,我为 IFoo 接口(interface)创建了第二个变体:
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;
关于c# - 使用泛型类型接口(interface)创建对象实例时编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63825752/
我是一名优秀的程序员,十分优秀!