gpt4 book ai didi

c# - 使用泛型类型接口(interface)创建对象实例时编译错误

转载 作者:行者123 更新时间:2023-12-04 08:56:09 27 4
gpt4 key购买 nike

我有一个接收泛型类型的接口(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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com