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
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);
}
}