C# 使用泛型类型接口创建对象实例时发生编译错误

C# 使用泛型类型接口创建对象实例时发生编译错误,c#,inheritance,interface,casting,covariance,C#,Inheritance,Interface,Casting,Covariance,我有一个接收泛型类型的接口,我们称它为IFoo。该泛型类型被约束为由另一个接口IBar实现。这两个接口定义如下: internal interface IFoo<out TBar> where TBar : IBar { } internal interface IBar { } 为什么编译器不够“聪明”,不能理解IFoo或具有泛型类型IBar的IFoo是同一件事?为什么强制转换不起作用?如果我理解这个问题,您需要制作SpecificFoo实现IFoo internal clas

我有一个接收泛型类型的接口,我们称它为IFoo。该泛型类型被约束为由另一个接口IBar实现。这两个接口定义如下:

internal interface IFoo<out TBar> where TBar : IBar
{
}

internal interface IBar
{
}

为什么编译器不够“聪明”,不能理解IFoo或具有泛型类型IBar的IFoo是同一件事?为什么强制转换不起作用?

如果我理解这个问题,您需要制作
SpecificFoo
实现
IFoo

internal class SpecificFoo : IFoo<SpecificBar>, IFoo
{ .. }
内部类特定foo:IFoo,IFoo
{ .. }
这样你就可以

IFoo correctFoo = new SpecificFoo();
//and
IFoo<IBar> anotherFoo = correctFoo;
IFoo correctFoo=newspecificfoo();
//及
IFoo anotherFoo=正确的foo;

IFoo
IFoo
不是一回事
IFoo
IFoo
的一个子类型,因此
IFoo
IFoo
,但是
IFoo
不一定是
IFoo
@Luke Woodward,尽管IFoo与IFoo没有直接关系,就像其他方式一样,因为我限制TBar实现IBar,我想他们应该是一样的是的,这很有效!谢谢!这是有道理的,SpecificFoo和IFoo之间需要有直接的关系,因为IFoo不一定是IFoo,就像@Luke Woodward说的那样
internal interface IFoo : IFoo<IBar>
{
}
// Compile error!!
IFoo incorrectFoo = new SpecificFoo();

// Cast error!!
IFoo alsoIncorrectFoo = (IFoo)new SpecificFoo();
internal class SpecificFoo : IFoo<SpecificBar>, IFoo
{ .. }
IFoo correctFoo = new SpecificFoo();
//and
IFoo<IBar> anotherFoo = correctFoo;