C# 为什么C不';实现接口时不允许继承返回类型
下面的代码在C#中不合法有什么合理的原因吗C# 为什么C不';实现接口时不允许继承返回类型,c#,.net,C#,.net,下面的代码在C#中不合法有什么合理的原因吗 签名必须与接口指定的内容完全匹配。没有理由不能从方法返回X的实例,但是方法签名必须使用IB 因为一个合理的原因。。从代码可读性的角度来看,这可能更可取 您可以显式地实现接口,并提供一个替代签名,该签名返回接口未定义的X。如果你知道你的IA实际上是一个X,你可以用它来代替。,因为C#不支持编译时接口的co和contravriance。这样,IA.Test()方法的实现必须与其声明完全匹配。但是,您可以在运行时返回X的实例 public X test();
签名必须与接口指定的内容完全匹配。没有理由不能从方法返回
X
的实例,但是方法签名必须使用IB
因为一个合理的原因。。从代码可读性的角度来看,这可能更可取
您可以显式地实现接口,并提供一个替代签名,该签名返回接口未定义的X
。如果你知道你的IA
实际上是一个X
,你可以用它来代替。,因为C#不支持编译时接口的co和contravriance。这样,IA.Test()方法的实现必须与其声明完全匹配。但是,您可以在运行时返回X的实例
public X test();
必须为任何非抽象类中的所有方法声明一个主体
试试这个:
class X : IA, IB
{
public IB test()
{
return new X();
}
}
interface IA
{
IB test();
}
interface IB { };
您可以使用显式接口实现来避免该问题
class X : IA, IB
{
public X test()
{
return this;
}
IB IA.test()
{
return this;
}
}
interface IA
{
IB test();
}
interface IB
{
}
更新:这个答案写在2009年。二十年来,人们一直在为C#提出回归型协方差,但现在看来,它最终会实现;我相当惊讶。有关公告,请参见的底部;我相信细节会随之而来
这一特性称为“返回型协方差”。C#不支持它,原因如下: 1) CLR不支持它。为了让它在C#中工作,我们只需要抛出一大堆小助手方法,将返回类型强制转换为正确的类型。没有什么能阻止你自己做那件事 2) 安德斯认为返回型协方差不是一个好的语言特征 3) \我们对该语言有很多更高的优先级。我们只有有限的预算,所以我们尽量只做最好的功能,我们可以在任何给定的版本。当然,这会很好,但是如果你想自己做的话,这很容易。最好是我们花时间添加一些功能,以改善开发人员的体验或为语言添加更多的表示能力。这会有所帮助
您可以使用“out”关键字您知道关于#2的其他信息是否可用吗?我喜欢阅读有关语言问题的书籍Brian Gideon对此问题的回答提供了一个示例,说明了如何执行#1。C#4.0的此功能仅支持通用接口和委托。它不会像问题示例中指定的那样工作,因为IA不是一个通用接口,而是一个很好的发现。看见
class X : IA, IB
{
public X test()
{
return this;
}
IB IA.test()
{
return this;
}
}
interface IA
{
IB test();
}
interface IB
{
}