使用通用类型接口

问题描述

我有一个接收通用类型的接口,我们称其为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;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...