【发布时间】:2013-05-03 10:53:26
【问题描述】:
我有一个很简单的问题,但是我以前没有遇到过这个问题。
看看这段代码:
interface IFoo
{
IBar MyBar { get; }
}
interface IBar
{
String Test { get; }
}
class Foo : IFoo
{
public Bar MyBar { get; set; }
}
class Bar : IBar
{
public String Test { get; set; }
}
问题在于 Foo 没有实现 IFoo,因为它返回 Bar 而不是 IBar。但我没有看到问题,因为 Bar 正在实施 IBar。我错过了什么吗?
我希望我的应用程序使用 Foo 类,但将 IFoo 暴露给解决方案的其他部分。
这是一种解决方法,但它似乎是一个丑陋的解决方案:
class Foo : IFoo
{
public Bar MyBar { get; set; }
IBar IFoo.MyBar {
get { return this.MyBar; }
}
}
这是要走的路,还是更好的路?
【问题讨论】:
-
Bar是IBar,但IBar不是Bar。 -
这称为返回类型协方差,根据this post C#,CLR 不支持。
-
“丑陋的方法”(也称为显式接口实现)确实是 C# 中解决此问题的唯一方法。事实上,这也是该功能存在的部分原因。
-
我认为您的解决方案(显式接口)是我的首选方式。另一个选择,因为你只有吸气剂是使用
out泛型:interface IFoo<out T> where T : IBar { T MyBar { get; } },然后你可以分配像:IFoo<IBar> f = new Foo();这样的 foo,但这很糟糕,因为你有这个无用的泛型一直在浮动。
标签: c#