有没有合理的理由说明为什么下面的代码在C#中不合法?
class X: IA, IB
{
public X test() // Compliation Error, saying that X is not IB
{
return this;
}
}
interface IA
{
IB test();
}
interface IB { };
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 33
此功能称为"返回类型协方差".由于以下原因,C#不支持它:
1)CLR不支持它.为了使它在C#中工作,我们必须吐出一大堆小助手方法,这些方法将返回类型转换为正确的东西.没有什么能阻止你自己这样做.
2)Anders认为返回类型协方差不是一个好的语言特征.
3)\我们有很多更高的语言优先级.我们的预算有限,因此我们只尝试在任何给定版本中尽我们所能.当然,这会很好,但如果你愿意的话,这很容易就可以自己做.更好的是,我们花时间添加功能,以改善开发人员的体验或为语言添加更多的代表性功能.
Bri*_*eon 17
您可以使用显式接口实现来避免此问题.
class X : IA, IB
{
public X test()
{
return this;
}
IB IA.test()
{
return this;
}
}
interface IA
{
IB test();
}
interface IB
{
}
Run Code Online (Sandbox Code Playgroud)
签名必须与接口指定的内容完全匹配.没有理由不能X从方法返回实例,但必须使用方法签名IB.
至于理性的原因......从代码可读性的角度来看,这可能是最好的.
您可以显式实现接口,并提供返回X未由接口定义的备用签名.如果你知道你IA的实际上是一个X,你可以使用它.
| 归档时间: |
|
| 查看次数: |
3179 次 |
| 最近记录: |