Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中是否可能与另一个接口的字段有接口,但在实现中使用实现接口的类?_C# - Fatal编程技术网

在C#中是否可能与另一个接口的字段有接口,但在实现中使用实现接口的类?

在C#中是否可能与另一个接口的字段有接口,但在实现中使用实现接口的类?,c#,C#,下面是一个示例实现 但是当我这样做时,我得到了以下错误“Foo”没有实现接口成员“IBar.MyBar” 公共接口IBar { 公共int Id{get;set;} } 公共类酒吧:IBar { 公共int Id{get;set;} } 公共接口IFoo { 公共IBar MyBar{get;} } 公共类Foo:IFoo { 公共栏MyBar{get;} } 因此,在复制代码之后,我认为您需要更改Foo类的实现 到目前为止,你有: public class Foo : IFoo { p

下面是一个示例实现

但是当我这样做时,我得到了以下错误“Foo”没有实现接口成员“IBar.MyBar”

公共接口IBar
{
公共int Id{get;set;}
}
公共类酒吧:IBar
{
公共int Id{get;set;}
}
公共接口IFoo
{
公共IBar MyBar{get;}
}
公共类Foo:IFoo
{
公共栏MyBar{get;}
}

因此,在复制代码之后,我认为您需要更改Foo类的实现

到目前为止,你有:

public class Foo : IFoo
{
    public Bar MyBar { get; }
}
我认为你的意思是这样说的,这将按照你的意愿起作用:

public class Foo : IFoo
{
   public IBar MyBar { get; }
}
请注意,在IFoo接口中,您将MyBar实现为IBar而不是Bar,因此会出现错误。如果我遗漏了什么,我很抱歉,但我认为这就是问题所在。
如果我能帮助你,我会很高兴的!:)

这个错误很明显:接口
IFoo
表示一个名为
MyBar
的成员,其类型为
IBar
,而不是
Bar
。此合同确保您始终知道您可以从API中获得什么。因此,以下内容将始终返回某种类型的
IBar

IFoo foo = GetMyFoo();
IBar bar = foo.MyBar; 
Bar
-类的实现是一个内部细节,客户不应该关心。因此,您可以轻松地交换该实现,而无需客户端重新编译


但是,有一种方法可以使返回类型成为共同变量。

编译器说了什么?
公共类Foo:IFoo{public IBar MyBar{get;}}
应该可以工作。您的方法只适用于C#9.0Foo必须实现IBar MyBar,而不是Bar MyBar…您需要共变量返回类型,这是C#9的一个建议:Anway不清楚您为什么需要它。您希望
getMyFoo().MyBar
返回什么?当然是一个
IBar
,不是吗?不是,这就是我想要做的,因为Bar实现了IBar来使用这个实现。我怎么能用C#9实现呢?