使用泛型接口创建对象实例时编译错误
Compile error when creating instance of object with generic type interface
我有一个接收泛型类型的接口,我们称它为 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();
为什么编译器不够“聪明”,无法理解泛型 IBar 的 IFoo 或 IFoo 是同一事物?为什么转换不起作用?
如果我理解这个问题,您将需要 SpecificFoo
实施 IFoo
internal class SpecificFoo : IFoo<SpecificBar>, IFoo
{ .. }
哪个可以让你
IFoo correctFoo = new SpecificFoo();
//and
IFoo<IBar> anotherFoo = correctFoo;
我有一个接收泛型类型的接口,我们称它为 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();
为什么编译器不够“聪明”,无法理解泛型 IBar 的 IFoo 或 IFoo 是同一事物?为什么转换不起作用?
如果我理解这个问题,您将需要 SpecificFoo
实施 IFoo
internal class SpecificFoo : IFoo<SpecificBar>, IFoo
{ .. }
哪个可以让你
IFoo correctFoo = new SpecificFoo();
//and
IFoo<IBar> anotherFoo = correctFoo;