C# 接口实现和泛型编译错误

C# 接口实现和泛型编译错误,c#,generics,C#,Generics,我有以下接口及其实现: public interface IFoo<in T> { void Notify(T obj); } public interface IBar { void DoSomething(IFoo<IBar> fooBar); } public class Bar : IBar { public void DoSomething(IFoo<IBar> fooBar) { fooB

我有以下接口及其实现:

public interface IFoo<in T>
{
    void Notify(T obj);
}

public interface IBar
{
    void DoSomething(IFoo<IBar> fooBar);
}

public class Bar
    : IBar
{
    public void DoSomething(IFoo<IBar> fooBar)
    {
        fooBar.Notify(this);
    }
}

public class Foo
    : IFoo<Bar>
{
    public void Notify(Bar obj)
    {
        Console.WriteLine("Hello world!");
    }
}
我得到一个编译错误:

无法从“Foo”转换为“IFoo


然而,由于Foo实现了IFoo和Bar实现了IBar,我不明白为什么不能解决这个问题。

我想如果我这样做的话,您希望在接口中使用协方差,我的Notify(t obj)方法不会被编译。如果我删除“in”,错误保持不变。仅仅因为
Foo
继承自
IFoo
,而
Bar
继承自
IBar
,并不意味着
IFoo
继承自
IFoo
。他们根本没有关系。这正是一个重复的问题。在您的示例中,Foo需要一个具体的Bar实例,而不是IBar。尝试向IBar接口中不存在的Bar添加另一个方法,您将看到Foo可以访问它。如果它可以访问它,那么它可能会使用它;如果它正在使用它,它将无法与IBar一起工作。你知道协方差和反方差之间的区别是什么吗?您的问题表明您希望接口是协变的,但您已将其标记为逆变的。读一下:我想你想要在你的界面(协方差)中,如果我这样做,我的Notify(tobj)方法将不会被编译。如果我删除“in”,错误保持不变。仅仅因为
Foo
继承自
IFoo
,而
Bar
继承自
IBar
,并不意味着
IFoo
继承自
IFoo
。他们根本没有关系。这正是一个重复的问题。在您的示例中,Foo需要一个具体的Bar实例,而不是IBar。尝试向IBar接口中不存在的Bar添加另一个方法,您将看到Foo可以访问它。如果它可以访问它,那么它可能会使用它;如果它正在使用它,它将无法与IBar一起工作。你知道协方差和反方差之间的区别是什么吗?您的问题表明您希望接口是协变的,但您已将其标记为逆变的。请阅读以下内容:
internal class Program
{
    private static void Main(string[] args)
    {
        var foo = new Foo();

        var bar = new Bar();
        bar.DoSomething(foo);
    }
}